【问题标题】:Using Windows Hooks to intercept mouse click on my application c++使用 Windows Hooks 拦截鼠标点击我的应用程序 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`。

标签: winforms visual-c++


【解决方案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 控件。

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      相关资源
      最近更新 更多