zoukankan      html  css  js  c++  java
  • 窗口间传送数据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不能用来传送带有指针的消息,否则发送消息会失败。

    起风了,努力生存
  • 相关阅读:
    [国家集训队]数颜色 / 维护队列
    [SP3267]DQUERY
    扩展欧几里得算法详解(exgcd)
    [CTSC2018]混合果汁
    极角排序那些事
    向量的点乘与叉乘学习笔记
    [APIO2014]序列分割
    CF1148D-Dirty Deeds Done Dirt Cheap
    CF176E Archaeology(set用法提示)
    【网络流24题】最长不下降子序列问题
  • 原文地址:https://www.cnblogs.com/StivenYang/p/8441346.html
Copyright © 2011-2022 走看看