在我的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 )
然而,这些都没有奏效。我应该使用什么才能让钩子在我的应用程序上运行?一旦这个工作,我计划使用点击的坐标检查是否在新对话框上并从那里处理它。
由于
答案 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控件。
由于