C++:GetMessage()函数
1. 功能概述
在C++的Windows编程中,GetMessage函数是消息循环的核心部分。它用于从调用线程的消息队列中获取消息。消息队列存储了各种与窗口相关的消息,如鼠标点击消息、键盘按键消息、窗口大小改变消息等。GetMessage函数会一直等待,直到获取到一个消息或者满足特定的退出条件。
2. 函数原型及参数解释
BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
参数说明:
lpMsg(LPMSG类型):这是一个指向MSG结构体的指针。MSG结构体用于存储获取到的消息信息,包括消息所属的窗口句柄、消息标识符、消息的两个参数(wParam和lParam)以及消息的时间戳和鼠标位置等信息。例如:
MSG msg;
GetMessage(&msg, NULL, 0, 0);
在这里,msg结构体将被填充消息相关的内容,后续可以根据这些内容来处理消息。
hWnd(HWND类型):这是一个窗口句柄,用于指定获取哪个窗口的消息。如果设置为NULL,则函数会获取属于调用线程的所有窗口的消息。通常在简单的Windows应用程序中,会将这个参数设置为NULL,以便获取应用程序所有窗口的消息。
wMsgFilterMin和wMsgFilterMax(UINT类型):这两个参数用于设置消息过滤范围。只有消息标识符在wMsgFilterMin和wMsgFilterMax之间(包括这两个值)的消息才会被获取。如果都设置为0,则获取所有消息。例如,如果只想获取鼠标消息,可以通过设置适当的消息标识符范围来实现消息过滤。不过在大多数情况下,为了获取所有与应用程序相关的消息,这两个参数都设置为0。
3. 返回值
函数返回一个BOOL类型的值。如果获取到消息并且这个消息不是WM_QUIT消息,返回非零值(TRUE);如果获取到的是WM_QUIT消息,表示应用程序应该退出,此时返回零(FALSE);如果发生错误(如传递了无效的参数),函数也返回零。
4. 示例代码
以下是一个典型的WinMain函数中的消息循环部分,展示了GetMessage函数的使用:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // 窗口类注册、窗口创建等操作省略 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
在这个示例中,GetMessage函数在一个while循环中被调用。只要获取到的消息不是WM_QUIT消息,循环就会继续。每次获取到消息后,会先通过TranslateMessage函数对某些键盘消息进行转换(如将虚拟键消息转换为字符消息),然后通过DispatchMessage函数将消息发送到相应窗口的窗口过程函数(WndProc)中进行处理。当GetMessage函数返回FALSE(通常是因为收到了WM_QUIT消息),消息循环结束,应用程序退出,WinMain函数返回msg.wParam作为应用程序的退出码。