Windows之重複的WM_COMMAND Message

Windows之重複的WM_COMMAND Message

近日將WinXP升為Win10,將VC6升為VS2016.按Menu後在WindowProc()會接收到兩個重複的WM_COMMAND Message.而Accelerator更會接收多個WM_COMMAND Message.同樣的代碼在WinXP和VC6重未出現.不斷查看Winmain()事件循環.因為遊戲引擎是實時驅動而非消息驅動的.所以使用PeekMessage ()而非GetMessage()讀取消Message.當改為while(GetMessage (&msg, NULL, 0, 0))消息驅動後問題無在出現.梯來是MSG這個Message沒有被清空道至.調用memset(&msg, 0, sizeof(MSG)); 問題得到完美解決.

主事件循環代碼簡介

1.WINDOWS消息的存儲器

MSG msg;

2.Accelerator加速鍵表的句柄

HACCEL hAccel;

hAccel =::LoadAccelerators(main_instance,”ACCEL”);

2.主事件循環非消息驅動的

while(true) {

3.清空MSG

memset(&msg, 0, sizeof(MSG));

4.從事件對列中獲得消息

PeekMessage(&msg,NULL,0,0,PM_REMOVE);

5.由 PostQuitMessage(0) 發送的WM_QUIT消息,被PeekMessage()檢測到跳出主循環

if(msg.message == WM_QUIT)

break;

6.處理加速鍵表

if(!::TranslateAccelerator(main_window,hAccel,&msg)) {

7.處理和轉換加速鍵.

TranslateMessage(&msg);

3.調用WinProc對消息進行處理,從MSG結構取的參數並傳遞.

DispatchMessage(&msg);

}

}

評論