我在编辑框中处理WM_KEYDOWN
消息
我正在处理一堆键,但是对于某些键(例如tab),我想阻止将可显示的字符附加到编辑框中。
case WM_KEYDOWN:
{
switch(wParam)
{
case VK_TAB:
//handle tab here
//Eat tab key
return 0;
default:
return DefWndProc(hwnd,message,wParam,lParam);
}
}
break;
我可以检测并删除WM_KEYUP
消息中的标签,但是使用此方法,标签键可以在编辑框中明显添加和删除。
有没有办法在WM_KEYDOWN
吃一把钥匙?
答案 0 :(得分:2)
PreTranslateMessage
。MSG
参数message
为WM_KEYDOWN
且wParam
为VK_TAB
且hwnd
为您的编辑控件,则处理它只是返回TRUE。返回TRUE表示该事件已被处理,因此CEdit
控件不会处理该事件。
答案 1 :(得分:2)
执行此操作的目的是处理WM_GETDLGCODE
消息并告诉窗口管理器编辑控件不想处理 TAB 键。 Raymond Chen在本文中讨论了这个问题:Those who do not understand the dialog manager are doomed to reimplement it, badly。正如雷蒙德的情况一样,这篇文章非常具有挑衅性。
文章中的代码示例如下所示:
LRESULT CALLBACK SubclassWndProc(
HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lres;
switch (uMsg) {
case WM_GETDLGCODE:
lres = CallWindowProc(...);
lres &= ~DLGC_WANTTAB;
if (lParam &&
((MSG *)lParam)->message == WM_KEYDOWN &&
((MSG *)lParam)->wParam == VK_TAB) {
lres &= ~DLGC_WANTMESSAGE;
}
return lres;
}
return CallWindowProc(...);
}
答案 2 :(得分:0)
捕获事件并自行传递消息。
WinApi教程应该帮助您,如何自己修改消息队列,等等。发送自己的消息,或阻止发送消息。