【发布时间】:2011-11-06 01:11:21
【问题描述】:
我不经常使用 winapi,我正在编写几乎 .NET 代码。但是这时候我不得不使用winapi来做一个简单的对话框。我想处理一些关键事件。因此,我在 MSDN 上查看了相应的回调消息 WM_KEYDOWN or 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;
结果它没有帮助。 我发现的其他解决方案如下:
- 按照here 的建议,或者使用
WM_GETDLGCODE事件来处理此键。 - 我发现很多线程(如this one)都在谈论一种称为
PreTranslateMessage的方法。但我什至没有这门课,因为我只是使用DialogBoxParam创建我的对话框
所以它们都不适合我。目前我不知道如何处理它。我注意到,在按键时似乎会出现WM_COMMAND 消息。
问候 Nem。
【问题讨论】:
-
您的消息处理程序是什么样的?我刚试过,对我来说效果很好(弹出消息框)。
-
即使我注释掉其他所有内容,也没有任何反应。所以它看起来像上面发布的。
-
不,我的意思是你的
while和GetMessage的东西。抱歉,我想我应该说“消息循环”。 -
没有,我认为是DialogBoxParam处理的。
-
哦,没看到。你读过这个吗:support.microsoft.com/kb/117563
标签: c++ winforms winapi keyboard callback