2011-07-22 88 views
5

要與某個服務進行通信,我必須重寫WindProc。並接收窗口消息。WndProc:如何在窗體最小化時獲得窗口消息

但是,當表單被最小化時,我不再收到任何消息。我知道它必須是這樣的,但是有沒有解決方法?我不希望隱藏窗體始終打開...

+0

你一直在看'NC_ * '消息?就像標題欄中的懸停一樣,這也可能是「非客戶區」。另外:你是什麼意思的窗口消息?就像鼠標懸停在最小化的表單上一樣? – Abel

回答

8

我最近還需要解決類似的問題。亞伯的回答讓我朝着正確的方向前進。這裏是我是如何做到的,通過改變正常的窗口,進入一個消息窗口只有一個完整的例子:

class MessageWindow : Form { 

    [DllImport("user32.dll")] 
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 

    public MessageWindow() { 
    var accessHandle = this.Handle; 
    } 

    protected override void OnHandleCreated(EventArgs e) { 
    base.OnHandleCreated(e); 
    ChangeToMessageOnlyWindow();   
    } 

    private void ChangeToMessageOnlyWindow() {   
    IntPtr HWND_MESSAGE = new IntPtr(-3); 
    SetParent(this.Handle, HWND_MESSAGE);   
    } 

    protected override void WndProc(ref Message m) { 
    // respond to messages here 
    } 
} 

注重構造:我發現,我需要訪問Handle屬性或以其他方式OnHandleCreated方法將不會被調用。不知道原因,也許有人可以解釋爲什麼。

我相信我的示例代碼也將回答一個相關的問題:How do I create a message-only window from windows forms?

+0

謝謝,像魅力一樣工作 – lenniep

+0

注意:您必須設置ShowInTaskbar = false。 注意:如果您想發送來自另一個進程的消息,則僅消息窗口是無用的,因爲儘管MSDN說應該在FindWindowEx中找到僅消息窗口,但事實並非如此。 – Elmue

3

如果您想要接收窗口消息,但不想顯示接收它們的窗體,則可以使用僅消息窗口,它從不顯示。如果使用它,則用於與用戶交互的實際C#表單不再需要從窗口服務接收消息。

Here's more on the subject as MSDN。一個警告雖然,它需要相當多的玩Window API,因爲一個純消息窗口不直接支持.NET。

0

你可以嘗試NativeWindow接收消息(VB代碼,不好意思):

Imports System.Windows.Forms 

Public Class MyClass: Inherits NativeWindow 

Private piFormHandle As Integer = 0 
Sub New() 
    Me.CreateHandle(New CreateParams) 
    piFormHandle = CInt(Me.Handle) 
End Sub 

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
    Select Case (m.Msg) 
     Case MyMessage 
    End Select 
    MyBase.WndProc(m) 
End Sub 

End Class