我正在处理编辑框中的
WM_KEYDOWN
消息。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
中的钥匙吗?
WM_GETDLGCODE
消息并告诉窗口管理器编辑控件不想处理 TAB 键。 Raymond Chen 在本文中讨论了这个问题:那些不理解对话管理器的人注定要重新实现它,非常糟糕。就像雷蒙德经常遇到的情况一样,这篇文章的标题相当具有挑衅性。
文章中的代码示例如下所示:
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(...);
}
PreTranslateMessage
。MSG
参数的 message
是 WM_KEYDOWN
并且 wParam
是 VK_TAB
并且 hwnd
是你的编辑控件,处理它并简单地返回 TRUE。返回 TRUE 意味着该事件已经被处理,因此不会被
CEdit
控件处理。
自己捕捉事件并传递消息。
WinApi 教程应该可以帮助您,了解如何自行修改消息队列。发送自己的消息,或阻止发送消息。