使用 Windows Hooks 拦截鼠标点击我的应用程序 c++
Posted
技术标签:
【中文标题】使用 Windows Hooks 拦截鼠标点击我的应用程序 c++【英文标题】:Using Windows Hooks to intercept mouse click on my application c++ 【发布时间】:2011-03-07 10:56:59 【问题描述】:在我的 C++ MFC 应用程序中,我在表单上有一个 ActiveX 控件。在某个时候,我创建并显示了一个新对话框。我不希望用户能够在第二个对话框启动时单击 ActiveX 控件,因此我尝试将其创建为子对话框。但是,ActiveX 控件始终以 Z 顺序出现在子对话框上方。我尝试在创建时发送消息以更改 Z 顺序,但没有任何效果。
我尝试使用 Windows Hooks 来拦截鼠标点击,代码如下:
GetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)CDWFDLG::ClickProc, GetModuleHandle(NULL), 0)
LRESULT CALLBACK CDWFDLG::ClickProc(int ncode, WPARAM wparam, LPARAM lparam)
if(wparam == WM_LBUTTONDOWN)
Beep(110, 30);
return TRUE;
return CallNextHookEx(0, ncode, wparam, lparam);
这会阻止我想要的所有鼠标左键单击。然而,它在所有事情上都这样做,而不仅仅是在我的应用程序上。我尝试使用
设置线程 IDGetCurrentThreadId()
和
GetWindowThreadProcessId(this->m_hWnd, &threadId )
但是这些都不起作用。我应该用什么来让钩子在我的应用程序上运行?一旦这个工作正常,我计划使用点击的坐标来检查是否在新对话框中并从那里处理它。
谢谢
【问题讨论】:
通过ShowDialog
简单地显示对话框不起作用?
@Thomas:完全同意。一个模态对话框应该可以解决这个问题。
我似乎没有将ShowDialog
作为对话框的方法。它肯定使用 CDialog 作为基类。有ShowWindow' and
DoModal`。
【参考方案1】:
GetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)CDWFDLG::ClickProc, GetModuleHandle(NULL), 0)
表示您正在全局挂钩,执行所有鼠标点击。
您想要的是使用 GetCurrentThreadId() 选项而不是 0 来挂钩 WH_MOUSE,这将产生您想要的结果。
【讨论】:
【参考方案2】:虽然我无法使用 Window Hooks 解决问题,但我想我已经使用对话框属性修复了它。我已将父对话框的 Control Parent
设置为 True,并将子对话框属性中的其他所有内容都保留为默认值(Control
为 false,Style
为 Popup 等)。
现在当我通过DoModal()
调用对话框时,它具有焦点并且不允许点击 ActiveX 控件。
谢谢
【讨论】:
以上是关于使用 Windows Hooks 拦截鼠标点击我的应用程序 c++的主要内容,如果未能解决你的问题,请参考以下文章