使用 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);

这会阻止我想要的所有鼠标左键单击。然而,它在所有事情上都这样做,而不仅仅是在我的应用程序上。我尝试使用

设置线程 ID
GetCurrentThreadId()

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++的主要内容,如果未能解决你的问题,请参考以下文章

C#用windows Api Hooks 控制鼠标键盘在一个窗体内

拦截鼠标点击

关于svn hooks拦截设置

vue3自定义hook函数

QT Windows平台屏蔽按键事件 自定义拦截按键输入

.NET下如何拦截鼠标、键盘消息?Win32NET来帮你