Winforms 使用Windows钩子拦截鼠标单击我的应用程序c++; 在我的C++ MFC应用程序中,我在表单上有一个ActiveX控件。在某个时候,我创建并显示了一个新对话框。我不希望用户能够在第二个对话框打开时单击ActiveX控件,因此我尝试将其创建为子对话框。但是,ActiveX控件始终按Z顺序显示在子对话框上方。我试着在create上发送消息来更改Z顺序,但没有任何效果 GetCurrentThreadId()

Winforms 使用Windows钩子拦截鼠标单击我的应用程序c++; 在我的C++ MFC应用程序中,我在表单上有一个ActiveX控件。在某个时候,我创建并显示了一个新对话框。我不希望用户能够在第二个对话框打开时单击ActiveX控件,因此我尝试将其创建为子对话框。但是,ActiveX控件始终按Z顺序显示在子对话框上方。我试着在create上发送消息来更改Z顺序,但没有任何效果 GetCurrentThreadId(),winforms,visual-c++,Winforms,Visual C++,我尝试使用Windows钩子拦截鼠标单击,代码如下: 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); r

我尝试使用Windows钩子拦截鼠标单击,代码如下:

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);
}
GetCurrentThreadId()
这阻止了所有的鼠标左键点击,这是我想要的。然而,它在任何事情上都能做到这一点,而不仅仅是在我的应用程序上。我已尝试使用设置线程Id

GetCurrentThreadId()

GetCurrentThreadId()
然而,这两种方法都不起作用。我应该使用什么来让钩子在我的应用程序上运行?一旦这是工作,我打算使用的坐标点击检查是否是在新的对话框,并处理它从那里

GetCurrentThreadId()

谢谢

虽然我不能用窗口挂钩解决这个问题,但我想我已经用对话框属性解决了。我已将父对话框的
Control parent
设置为True,并将子对话框属性中的所有其他内容保留为默认值(
Control
为false,
Style
为弹出窗口等)

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

GetCurrentThreadId()
谢谢

GetWindowsHookEx(鼠标右键,(HOOKPROC)CDWFDLG::ClickProc,GetModuleHandle(NULL),0)

GetCurrentThreadId()
表示您正在全局挂接,所有鼠标单击均已执行

GetCurrentThreadId()

您需要的是使用选项GetCurrentThreadId()而不是0钩住鼠标,这将产生您想要的结果。

仅通过
ShowDialog
以模式显示对话框不起作用?@Thomas:完全同意。模式对话框应该可以解决这个问题。我似乎没有
ShowDialog
作为对话框的方法。它肯定是使用CDialog作为基类。有
ShowWindow”和
DoModal`。
GetCurrentThreadId()