应用程序为了获取源源不断的消息,就需要调用函数 GetMessage 来实现,因为所有在窗口上的输入消息,都会放到应用程序的消息队列里,然后再发送给窗口回调函数处理。 函数 GetMessage 声明如下: WINUSERAPI BOOL WINAPI GetMessageA( __out LPMSG lpMsg, __in_opt HWND hWnd, __in UINT wMsgFilterMin, __in UINT wMsgFilterMax); WINUSERAPI BOOL WINAPI GetMessageW( __out LPMSG lpMsg, __in_opt HWND hWnd, __in UINT wMsgFilterMin, __in UINT wMsgFilterMax); #ifdef UNICODE #define GetMessage GetMessageW #else #define GetMessage GetMessageA #endif // !UNICODE lpMsg 是从线程消息队列里获取到的消息指针。 hWnd 是想获取那个窗口的消息,当设置为 NULL 时是获取所有窗口的消息。 wMsgFilterMin 是获取消息的 ID 编号最小值,如果小于这个值就不获取回来。 wMsgFilterMax 是获取消息的 ID 编号最大值,如果大于这个值就不获取回来。 函数返回值可能是 0 ,大于 0 ,或者等于 -1 。如果成功获取一条非 WM_QUIT 消息时,就返回大于 0 的值;如果获取 WM_QUIT 消息时,就返回值 0 值。如果出错就返回 -1 的值。 调用这个函数的例子如下: #001 // 主程序入口 #002 // #003 // 蔡军生 2007/07/19 #004 // QQ: 9073204 #005 // #006 int APIENTRY _tWinMain(HINSTANCE hInstance, #007 HINSTANCE hPrevInstance, #008 LPTSTR lpCmdLine, #009 int nCmdShow) #010 { #011 UNREFERENCED_PARAMETER(hPrevInstance); #012 UNREFERENCED_PARAMETER(lpCmdLine); #013 #014 // #015 MSG msg; #016 HACCEL hAccelTable; #017 #018 // 加载全局字符串。 #019 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); #020 LoadString(hInstance, IDC_TESTWIN, szWindowClass, MAX_LOADSTRING); #021 MyRegisterClass(hInstance); #022 #023 // 应用程序初始化 : #024 if (!InitInstance (hInstance, nCmdShow)) #025 { #026 return FALSE; #027 } #028 #029 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWIN)); #030 #031 // 消息循环 : #032 BOOL bRet; #033 while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0) #034 { #035 if (bRet == -1) #036 { #037 // 处理出错。 #038 #039 } #040 else if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) #041 { #042 TranslateMessage(&msg); #043 DispatchMessage(&msg); #044 } #045 } #046 #047 return (int) msg.wParam; #048 } #049 第 33 行就是获取所有窗口的消息回来。
转载于:https://www.cnblogs.com/ajuanabc/archive/2007/07/20/2464333.html