【发布时间】:2013-07-09 02:01:10
【问题描述】:
我在从 DLL 文件创建无模式对话框时遇到问题。我的对话框没有什么特别之处,只有一个确定按钮和一个编辑框。我查看了这篇 Microsoft 知识库文章 (http://support.microsoft.com/kb/233263) 并实施了它的解决方案来创建一个窗口挂钩来抓取和处理消息。
Microsoft 提供的方法解决了 Tab 键问题,但是,它产生了另一个问题。当我在对话框的编辑框中键入时,我按的任何内容都会重复 4 次。例如,如果我在键盘上按“a”,“aaaa”将显示在编辑框中。
如果我禁用 Window Hook,那么编辑框可以正常工作并且只显示一个“a”。
我需要对 Window Hook 程序做些什么来解决这个问题?
非常感谢任何帮助。
- - 编辑 - -
根据要求,我的窗口挂钩程序代码:(与知识库文章相同)
LRESULT FAR PASCAL GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) {
LPMSG lpMsg = (LPMSG) lParam;
if (nCode >= 0 && PM_REMOVE == wParam) {
// Don't translate non-input events.
if ((lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST)) {
if (IsDialogMessage(hwndDllDlg, lpMsg)) {
// The value returned from this hookproc is ignored,
// and it cannot be used to tell Windows the message has been handled.
// To avoid further processing, convert the message to WM_NULL
// before returning.
lpMsg->message = WM_NULL;
lpMsg->lParam = 0;
lpMsg->wParam = 0;
}
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
我的对话框回调过程:
BOOL CALLBACK DllDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_INITDIALOG:
hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, NULL, GetCurrentThreadId());
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
DestroyWindow(hwndDlg);
hwndDllDlg = NULL;
}
return TRUE;
case WM_DESTROY:
UnhookWindowsHookEx(hHook);
return FALSE;
}
return FALSE;
}
}
hHook 和 hwndDllDlg 分别定义为 HHOOK 和 HWND。
HHOOK hHook;
HWND hwndDllDlg = CreateDialog(0, MAKEINTRESOURCE(DLG_MAIN), 0, DllDlgProc);
【问题讨论】:
-
嗯,你需要做的第一件事就是在你的问题中包含处理消息的钩子代码。
-
您的代码不是我们所需要的。请发布创建对话框的代码,并解释它运行的步骤。它是主 UI 线程还是不同的东西?您将变量存储在哪里?
标签: c++ dll dialog modeless keyboard-input