当前位置:编程学习 > C/C++ >>

C语言中PostMessage And SendMessage

 

PostMessage :

函数功能:该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得。

 

  函数原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

 

  参数

 

  hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:

 

  HWND_BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口。

 

  NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样。

 

  Msg:指定被寄送的消息。

 

  wParam:指定附加的消息特定的信息。

 

  IParam:指定附加的消息特定的信息。

 

  返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。

 

  备注:需要以HWND_BROADCAST方式通信的应用程序应当用函数RegisterwindwosMessage来获得应用程序间通信的独特的消息。

 

  如果发送一个低于WM_USER范围的消息给异步消息函数(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息参数不能包含指针。否则,操作将会失败。函数将再接收线程处理消息之前返回,发送者将在内存被使用之前释放。

 

  速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。

 

  P.S. 为什么 “如果发送一个低于WM_USER范围的消息给异步消息函数(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息参数不能包含指针。否则,操作将会失败。

HTML5标准下的postMessage

  在HTML5中新增了postMessage方法,postMessage可以实现跨文档消息传输(Cross Document Messaging),Internet Explorer 8, Firefox 3, Opera 9, Chrome 3和Safari 4都支持postMessage。

 

  可以通过绑定window的message事件来监听发送跨文档消息传输内容

 

SendMessage :

函数功能  该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。

 

  LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

 

  参数:

 

  hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

 

  Msg:指定被发送的消息。

 

  wParam:指定附加的消息指定信息。

 

  IParam:指定附加的消息指定信息。

 

  返回值:返回值指定消息处理的结果,依赖于所发送的消息。

 

  备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。

 

  如果指定的窗口是由正在调用的线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。

 

  Windows CE:Windows CE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要检查发送的消息是否被支持。

 

  速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。

 

  SendMessage函数使用实例

 

  程序控制拉下或收起组合框的下拉列来

 

  一般情况下,为了拉下或收起组合框的下拉列表,需要用键盘或鼠标进行操作,而有时我们希望程序运行的某个时刻自动拉出下拉列表(比如在一些演示程序中),为了实现这个目的,我们也只有借助于SendMessage函数,方法是发一个CB_SHOWDROPDOWN(&H14F)消息给组合框。

 

  在发CB_SHOWDROPDOWN消息时,wParam参数决定了是拉下列表(=True时)还是收起列表(=False时),lParam无用(设为0)。

------------- C++ -----------------

 

  #include "windows.h"

 

  int main(int argc, char* argv[])

 

  {

 

  HWND hWnd = ::FindWindow(NULL,"QQ2010");

 

  if( hWnd != NULL)

 

  {

 

  ::SendMessage(hWnd,WM_CLOSE,0,0);

 

  }

 

  return 0;

 

  }

 

SendMessage函数功能描述:将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口过程,直到窗口过程处理完消息后才返回。

.函数原型:

LRESULT SendMessage(

HWND hWnd, // 目标窗口句柄

UINT Msg, // 被发送的消息

WPARAM wParam, // 第一个消息参数

LPARAM lParam // 第二个消息参数

);

 

.参数:

hWnd

窗口过程接收消息的窗口句柄。如果此参数为HWND_BROADCAST,则消息被送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口。消息不被送到子窗口。

Msg

指定被发送的消息;

wParam

指定附加消息的特定信息;

lParam

指定附加消息的特定信息。

 

.返回值:

返回值返回消息处理的结果,其依赖于所发送的消息。

 

.备注:

需要以HWND_BROADCAST 方式通信的应用程序应该使用RegisterWindowMessage 函数来获得应用程序间通信的独特消息。

如果指定的窗口通过调用线程被创建,则窗口过程作为子程序被立即调用。如果指定的窗口通过调用不同线程被创建,则系统切换到该线程并调用适当的窗口过程。线程间的消息只有在接收线程执行消息检索代码时才被处理。发送线程将被阻塞到接收线程处理完消息为止。

Windows CE:Windows CE不支持Windows桌面平台所支持的所有消息。在使用SendMessage函数之前,应检查发送的消息是否被Windows CE所支持。

 

.使用环境:

Windows NT:3.1及以上版本;

Windows:95及以上版本;

Windows CE:1.0及以上版本;

头文件:winuser.h;

输入库:user32.lib;

Unicode:在WindowsNT(Windows2000)环境下以Unicode和ANSI方式实现。

 

.示例代码:

case WM_KEYDOWN:

        switch (wParam)

        {

        case VK_HOME:

             SendMessage (hwnd, WM_VSCROLL, SB_TOP, 0) ;

             break ;

 

        case VK_END:

             SendMessage (hwnd, WM_VSCROLL, SB_BOTTOM, 0) ;

             break ;

 

        case VK_PRIOR:

             SendMessage (hwnd, WM_VSCROLL, SB_PAGEUP, 0) ;

             break ;

        ...

        }

        return 0 ;

    ...

 

.常见问题

1)使用SendMessage来实现剪切、复制和粘贴

 

SendMessage(hwnd, WM_COPY, 0, 0);

SendMessage(hwnd, WM_CUT, 0, 0);

SendMessage(hwnd, WM_PASTE, 0, 0);

2)SendMessage与PostMessage的区别补充:软件开发 , C语言 ,

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,