C# Winforms控件窃取WndProc WM\u NCHITEST

C# Winforms控件窃取WndProc WM\u NCHITEST,c#,winforms,wndproc,C#,Winforms,Wndproc,我正在用C语言构建一个表单,它在WndProc函数中使用WM\u NCHITEST事件。它在页面上没有控件的情况下工作得很好,但是当我向页面添加面板时,我的WndProc函数停止接收WM\u NCHITEST事件。你知道我能做些什么来阻止这一切吗 更新:我的窗口通常是无边框的,但当我在有边框模式下运行时,当光标移动到窗口框架上时会调用WM\u NCHITTEST事件,让我认为我拥有的表单大小控件(Chromium Embedded Web Browser)正在拦截消息。有没有办法把WndProc

我正在用C语言构建一个表单,它在
WndProc
函数中使用
WM\u NCHITEST
事件。它在页面上没有控件的情况下工作得很好,但是当我向页面添加面板时,我的
WndProc
函数停止接收
WM\u NCHITEST
事件。你知道我能做些什么来阻止这一切吗

更新:我的窗口通常是无边框的,但当我在有边框模式下运行时,当光标移动到窗口框架上时会调用
WM\u NCHITTEST
事件,让我认为我拥有的表单大小控件(Chromium Embedded Web Browser)正在拦截消息。有没有办法把WndProc的控制权从一个杂乱无章的窗口夺回来

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x0083) //WM_NCAlSIZE
    {
        if (borderless)
        {
            return; //Works even with a control on the page.
        }
    }
    if (m.Msg == 0x0084) //WM_NCHITEST
    {
        Debug.Print("If there is a control on the page I won't print :(");
    }
    base.WndProc(ref m);
}

运行Chromium Embedded Web Browser有两个复杂问题:首先,它创建自己的窗口并作为子窗口附加到您的窗口,这意味着您需要拦截子窗口的WndProc。其次,CefSharp使用
multi_threaded\u message\u loop=true
运行,这实际上会启动一个新线程来处理浏览器的消息,这意味着您需要在UI线程和它的线程之间来回移动时小心谨慎

这个解决方案涉及到对PInvoke的自由使用,所以我为它做了一个要点


运行Chromium嵌入式Web浏览器有两个复杂问题:首先,它创建自己的窗口并作为子窗口附加到您的窗口,这意味着您需要截取子窗口的WndProc。其次,CefSharp使用
multi_threaded\u message\u loop=true
运行,这实际上会启动一个新线程来处理浏览器的消息,这意味着您需要在UI线程和它的线程之间来回移动时小心谨慎

这个解决方案涉及到对PInvoke的自由使用,所以我为它做了一个要点


我的水晶球显示您的面板与窗体完全重叠。所以,就是这个面板获得了所有的点击测试信息。我的水晶球说,你的面板完全与表单重叠。因此,是面板获取所有命中测试消息。嗨!一个非常有趣的答案!我使用的是与您不同的版本(CEF 3.2454.1344.g2782fb8、Chrome 45.0.2454.101和.net 4.5.1),因此我的子窗口有不同的名称:
CefBrowserWindow
Chrome\u WidgetWin\u 0
Chrome\u RenderWidgetHostHWND
。我应该用哪一个?嗨!一个非常有趣的答案!我使用的是与您不同的版本(CEF 3.2454.1344.g2782fb8、Chrome 45.0.2454.101和.net 4.5.1),因此我的子窗口有不同的名称:
CefBrowserWindow
Chrome\u WidgetWin\u 0
Chrome\u RenderWidgetHostHWND
。我应该用哪一个?