如何處理按鍵和鍵入Windows消息循環中的事件?我需要能夠調用兩個函數OnKeyUp(char c);
和OnKeyDown(char c);
。鍵盤輸入&Win32消息循環
我從google搜索到的當前文獻引起了我對WM_CHAR或WM_KEYUP和WM_KEYDOWN的困惑,它通常針對PDA或託管代碼,而我正在使用C++。
如何處理按鍵和鍵入Windows消息循環中的事件?我需要能夠調用兩個函數OnKeyUp(char c);
和OnKeyDown(char c);
。鍵盤輸入&Win32消息循環
我從google搜索到的當前文獻引起了我對WM_CHAR或WM_KEYUP和WM_KEYDOWN的困惑,它通常針對PDA或託管代碼,而我正在使用C++。
使用char c = MapVirtualKey(param,MAPVK_VK_TO_CHAR);
將虛擬鍵碼轉換爲char,並處理WM_KEYUP和WM_KEYDOWN及其wParams。
if (PeekMessage (&mssg, hwnd, 0, 0, PM_REMOVE))
{
switch (mssg.message)
{
case WM_QUIT:
PostQuitMessage (0);
notdone = false;
quit = true;
break;
case WM_KEYDOWN:
WPARAM param = mssg.wParam;
char c = MapVirtualKey (param, MAPVK_VK_TO_CHAR);
this->p->Input()->Keyboard()->Listeners()->OnKeyDown (c);
break;
case WM_KEYUP:
WPARAM param = mssg.wParam;
char c = MapVirtualKey (param, MAPVK_VK_TO_CHAR);
this->p->Input()->Keyboard()->Listeners()->OnKeyUp (c);
break;
}
// dispatch the message
TranslateMessage (&mssg);
DispatchMessage (&mssg);
}
一個典型的C++消息循環看起來像這樣
MSG msg;
while (GetMessage(&msg, null, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
的TranslateMessage的功能是產生從WM_KEYDOWN消息WM_CHAR消息,因此,如果你想看到你需要確保將消息傳遞WM_KEYDOWN到WM_CHAR消息它。如果你不關心WM_CHAR消息,你可以跳過它,並做這樣的事情。
extern void OnKeyDown(WPARAM key);
extern void OnKeyUp(WPARAM key);
MSG msg;
while (GetMessage(&msg, null, 0, 0))
{
if (msg.message == WM_KEYDOWN)
OnKeyDown (msg.wParam);
else (msg.message == WM_KEYUP)
OnKeyUp(msg.wParam);
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
請注意,OnKeyDown和OnKeyUp消息被定義爲採用WPARAM而不是char。這是因爲WM_KEYDOWN和WM_KEYUP的值不限於適合char的值。請參見WM_KEYDOWN
這裏的問題是,雖然我現在有代碼運行鍵和鍵,我也有代碼是不可移植的。我需要一種將WPARAM轉換爲更具可移植性的方法,而不是將所有跨平臺代碼都取出來並僅將其設置爲窗口,以便我可以測試虛擬鍵值,因此使用'char'。我也不想花費一天的時間爲每個字符寫入代碼進行轉換 – 2010-03-14 19:46:44