Windows API一日一练(11)GetMessage函数

Post date: 2012/3/27 上午 07:16:31

分类: Direct3D2007-07-20 08:51 2507人阅读 评论(0) 收藏 举报

应用程序为了获取源源不断的消息,就需要调用函数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行就是获取所有窗口的消息回来。