Win32消息处理API---SendMessage

本文详细介绍了Windows API函数SendMessage的工作原理,包括其同步特性、参数说明及返回值等。并通过一个文本编辑器示例展示了如何使用该函数处理键盘输入。

 

05、SendMessage

功能说明

该函数发送消息时,系统会调用指定窗口(hWnd)的事件发布函数,获取所发消息,等待窗口事件发布函数对该消息处理完毕,SnedMessage函数才能返回。如果指定窗口为广播窗口(HWND_BROADCAST),则消息接收对象就是所在系统的所有顶层窗口,而SendMessage不能为所有窗口之子窗口发送消息。SendMessage发送消息为同步发送,必须要等待接收方处理该消息完毕之后,才能够返回。

PostMessage区别:PostMessage将一个消息投递到一个线程的消息队列或者接收窗口后立即返回,不会等待消息的处理结果,只关心消息投递是否成功,也就是说PostMessage是异步的。

 

函数形式

LRESULT SendMessage

HWND    hWnd  // 指定的消息接收窗口,其窗口事件发布函数将接收和处理消息

UINT    Msg  // 所发消息之消息ID

WPARAM  wParam// 所发消息之字参数

LPARAM  Iparam  // 所发消息之值参数

);

 

参数说明

1>hWnd [in]

指定的消息接收窗口,其窗口事件发布函数将接收和处理消息。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不会发送到它们的子窗口。另外hWnd为非空参数。

 

2>Msg[in]

指定被发送的消息ID

 

3>wParam[in]

发送消息的字参数,跟消息类型、性质相关。

 

4>lParam[in]

发送消息的值参数,跟消息类型、性质相关。

 

返回值

返回值依赖于所发送的消息类型及性质,所发消息的处理结果。

 

备注

需要以 HWND_BROADCAST方式发送消息的应用程序,应当用函数 RegisterwindwosMessage来获得应用程序间通信的特征消息。

Win32下:系统仅仅为系统级消息进行封送处理(那些定义在0WM_USER 范围内的消息),要发送自定义消息(那些数值定义在WM_USER之上的消息)到另一个进程,用户必须进行自定义封送处理(就是编组处理之意)。

如果SendMessage的调用者跟指定窗口处于同一线程,则窗口事件发布函数就如同子程序一样被立即调用;如果而这不在同一线程,则系统就切换到窗口所在线程,并调用相关的窗口事件发布函数。在线程之间发送的消息,只有当接收线程在执行消息检索代码的时候才会被处理,此时SendMessage所在线程会被阻塞,直到接收线程处理该消息完毕,然而,此时发送线程却会处理接到的非队列消息。为了避免这种现象发生,最好使用SendMessageTimeout函数,设置参数为SMTO_BLOCK

Windows桌面平台支持的所有消息,在Windows CE系统下,并非都支持的,因此在使用SendMesssge之前,要检查发送的消息是否被支持。

 

适用

Windows NT3.1及以上版本:Windows95及以上版本;Windows CE1.0及以上版本;头文件:winuser.h;输入库:user32.libUnicode:在Windows NT环境下以UnicodeANSI方式实现。

 

应用举例

处理键盘输入的一段代码。下面的例子演示了在一个简单的文本编辑器中如何使用插入记号,更新插入位置为用户类型打印字符,并使用各种键移动通过客户端区。

 

#define  TEXTMATRIX(x, y)   *(pTextMatrix + (y * nWindowCharsX) + x)

// Global variables.

HINSTANCE hinst;                  // current instance

HBITMAP hCaret;                   // caret bitmap

HDC hdc;                          // device context 

PAINTSTRUCT ps;                   // client area paint info

static char *pTextMatrix = NULL;  // points to text matrix

static int  nCharX,               // width of char. in logical units

            nCharY,               // height of char. in logical units

            nWindowX,             // width of client area

            nWindowY,             // height of client area

            nWindowCharsX,        // width of client area

            nWindowCharsY,        // height of client area

            nCaretPosX,           // x-position of caret

            nCaretPosY;           // y-position of caret

static UINT uOldBlink;            // previous blink rate

int x, y;                         // coordinates for text matrix

TEXTMETRIC tm;                    // font information

 

LONG APIENTRY MainWndProc(

    HWND hwnd,            // window handle

    UINT message,         // type of message

    UINT wParam,          // additional information

    LONG lParam)