2013-12-10 46 views
1

我在C#中使用WndProc函數中的WM_NCHITEST事件來構建表單。它可以在頁面上沒有任何控件的情況下正常工作,但是當我將一個面板添加到頁面時,我的WndProc函數停止接收WM_NCHITEST事件。任何想法我能做些什麼來阻止這一點?Winforms控件竊取WndProc WM_NCHITEST

UPDATE:我在正常邊界的窗口,但是當我做接壤模式下運行的WM_NCHITTEST事件被稱爲當光標將鼠標懸停在窗框,讓我覺得窗體大小控制我有(鉻嵌入式Web瀏覽器)正在攔截消息。任何方式從一個不規則的窗口奪回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); 
} 
+0

我的水晶球說,你的面板是完全重疊的形式。所以它是面板獲取所有命中測試消息。 –

回答

1

有運行Chromium嵌入式Web瀏覽器2周的併發症,首先它會創建自己的窗口並連接作爲一個孩子到你的,這意味着你需要截取的子窗口的WndProc中。其次,CefSharp以multi_threaded_message_loop=true運行,它實際上啓動了一個新線程來處理瀏覽器的消息,這意味着您需要小心地在UI線程和UI線程之間來回切換。

該解決方案涉及自由使用PInvoke,所以我已經爲它做了一個要點。

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

+0

嗨!一個非常有趣的答案!我使用的是不同的版本(CEF 3.2454.1344.g2782fb8,Chromium 45.0.2454.101和.net 4.5.1。),所以我的子窗口具有不同的名稱:CefBrowserWindow,Chrome_WidgetWin_0,Chrome_RenderWidgetHostHWND。我應該使用哪一個? – mike