使用Windows Hooks拦截鼠标点击我的应用程序c ++

时间:2011-03-07 10:56:59

标签: winforms visual-c++

在我的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 )

然而,这些都没有奏效。我应该使用什么才能让钩子在我的应用程序上运行?一旦这个工作,我计划使用点击的坐标检查是否在新对话框上并从那里处理它。

由于

2 个答案:

答案 0 :(得分:1)

GetWindowsHookEx(WH_MOUSE_LL,(HOOKPROC)CDWFDLG :: ClickProc,GetModuleHandle(NULL),0)

表示您正在全局挂钩,所有鼠标点击都已执行。

你想要的是勾选WH_MOUSE,使用选项GetCurrentThreadId()而不是0,这将产生你想要的结果。

答案 1 :(得分:0)

虽然我无法使用Window Hooks解决问题,但我想我已经使用对话框属性修复了它。我已将父对话框的Control Parent设置为True,并将子对话框属性中的所有其他内容保留为默认值(Control为false,Style为Popup等)。

现在,当我通过DoModal()调用对话框时,它具有焦点,并且不允许点击ActiveX控件。

由于