Winforms控制窃取WndProc WM_NCHITEST

时间:2013-12-10 02:24:44

标签: c# winforms wndproc

我正在使用WM_NCHITEST函数中的WndProc事件在C#中构建表单。它在页面上没有任何控件时效果很好,但是当我向页面添加了一个面板时,我的WndProc函数停止了接收WM_NCHITEST个事件。知道我能做些什么来阻止这个吗?

UPDATE :我的窗口通常是无边框的,但是当我以边框模式运行时,当光标鼠标悬停在窗口框架上时会调用WM_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);
}

1 个答案:

答案 0 :(得分:1)

运行Chromium Embedded Web Browser有两个复杂问题,它首先创建自己的窗口,并将其作为子项附加到您的窗口,这意味着您需要拦截子窗口的WndProc。其次CefSharp以multi_threaded_message_loop=true运行,它实际上会激活一个新的线程来处理浏览器的消息,这意味着你需要小心翼翼地从你的UI线程和它的来回来回。

解决方案涉及自由使用PInvoke,所以我已经为它做了一个要点。

Method to watch a child window messages specifically for use with CefSharp Chromium Embedded Web Browser