窗口间传送数据wsprintf,WM_SETTEXT,SendMessage的理解

对wsprintf  API函数的理解:

int wsprintf

( LPTSTR lpOut, // pointer to buffer for output

 LPCTSTR lpFmt, // pointer to format-control string

 ... // optional arguments

);

第一个参数是输出目的缓冲区,第二个参数是要往缓冲区里面放的内容,

如果参数二中有%s,%x等格式化字符串的符号,就需要在后面加上格式化

字符串的实际内容,即wsprintf这个函数的参数是不确定的,最少有两个

参数。

 WM_SETTEXT  的理解:

WM_SETTEXT 
wParam = 0;                     // not used; must be zero 
lParam = (LPARAM)(LPCTSTR)lpsz; // address of window-text string 
 
在调用SendMessage的时候,

LRESULT SendMessage(
  HWND hWnd,      // handle of destination window
  UINT Msg,       // message to send
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);
 
SendMessage:

第一个参数是你即将要向他发送消息的目的窗口句柄

第二个参数是发送的消息类型。WINDOWS中有很多消息的定义,是以WM_...开头的。

第三第四个参数就是要发送的消息的两个参数的内容。每种类型的

消息都有两个参数,lParam,wParam,通过MSDN可以查找具体的格式。在例子中

WM_SETTEXT中第一个参数wParam必须为0,lParam是指向发送的字符串的首地址。

通过以上三个函数的配合,可以向目标窗口发送消息。

另外的有关API函数有COPYDATASTRUCT:

typedef struct tagCOPYDATASTRUCT {  // cds 
    DWORD dwData; 
    DWORD cbData; 
    PVOID lpData; 
} COPYDATASTRUCT; 
 
第一个参数是备用字段,一般不用或者用来表明变量的类型,

第二个参数是发送字符的长度

第三个参数是指向待发送数据的指针。

WM_COPYDATA的格式:

WM_COPYDATA 
wParam = (WPARAM) (HWND) hwnd;            // handle of sending window 
lParam = (LPARAM) (PCOPYDATASTRUCT) pcds; // pointer to structure with data 
 

这个函数是专门用来向不同程序的窗口发送消息的,使用例子:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data

stCopyData  COPYDATASTRUCT <>     ;定义COPY结构体变量

.code

...

invoke  SendMessage,hDestWnd,WM_COPYDATA,hWnd,addr stCopyData     ;使用结构体变量时注意先要填充结构体

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

通过以上代码就可以向其他窗口发送消息了。


SendMessage和PostMessage的区别:

LRESULT SendMessage(
  HWND hWnd,      // handle of destination window
  UINT Msg,       // message to send
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

Return Values

The return value specifies the result of the message processing and depends on the message sent.

BOOL PostMessage(
  HWND hWnd,      // handle of destination window
  UINT Msg,       // message to post
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
); 

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, callGetLastError.

两个函数的参数是一模一样的,不一样的只是返回值类型。

SendMessage是在向目标程序发送过去消息以后等待发送的消息被处理完毕以后,才从目的程序中返回来。返回值的具体情况依赖于原程序的发送和目标进程对消息的处理。

PostMessage是直接向目标程序的消息队列里面插入发送的消息,不论目标程序处理没处理,都从目标程序中返回来,发送成功返回非0值,发送失败返回0。

PostMessage不能用来传送带有指针的消息,否则发送消息会失败。

起风了,努力生存
原文地址:https://www.cnblogs.com/StivenYang/p/8441346.html