近日將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);
}
}