[英]WinAPI - How to redirect all stdout of a program and external DLLs to the Win32 standard output handle?
[英]How to handle keyboard events in a winapi standard dialog?
我不經常使用winapi,我寫的幾乎是.NET代碼。 但此時我必須使用winapi進行簡單的對話。 我想處理一些關鍵事件。 因此,我在MSDN上觀察了相應的回調消息WM_KEYDOWN
或WM_KEYUP
,並將其添加到我的回調函數中。
INT_PTR CALLBACK cbfunc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
// ...
case WM_KEYUP:
MMsgBox("up"); // I never get here
return 0;
case WM_KEYDOWN:
MMsgBox("down"); // I never get here
return 0;
// ...
}
return 0;
}
但WM_KEYUP
和WM_KEYDOWN
都不會被觸發。 然后我說找到解決這個問題的方法。 我想我的對話可能會吃掉這些消息。 所以我補充說:
case WM_GETDLGCODE:
return DLGC_WANTALLKEYS;
結果它沒有幫助。 我發現的其他解決方案如下:
WM_GETDLGCODE
事件來處理此鍵,如此處所示 。 PreTranslateMessage
的方法。 但我甚至沒有這個類,因為我只是使用DialogBoxParam
創建我的對話框 所以他們都沒有為我工作。 在那一刻我不知道如何處理它。 我注意到的是,在按鍵時,似乎發生了WM_COMMAND
消息。
問候內姆。
根據此鏈接 ,某些消息很難與對話框一起捕獲,因為Windows在內部處理它們並且它們永遠不會到達DialogProc
。 以下是我能想到的兩個選項:
WM_COMMAND
事件上使用GetAsyncKeyState
DialogProc
將處理WM_KEYDOWN
等消息。 替換這個
case WM_KEYUP:MMsgBox(“up”); //我從來沒有回到這里0;
case WM_KEYDOWN:
MMsgBox("down"); // I never get here
return 0;
有了這個
case WM_KEYUP:MMsgBox(“up”); //我從來沒有在這里休息
case WM_KEYDOWN:
MMsgBox("down"); // I never get here
break;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.