要與某個服務進行通信,我必須重寫WindProc
。並接收窗口消息。WndProc:如何在窗體最小化時獲得窗口消息
但是,當表單被最小化時,我不再收到任何消息。我知道它必須是這樣的,但是有沒有解決方法?我不希望隱藏窗體始終打開...
要與某個服務進行通信,我必須重寫WindProc
。並接收窗口消息。WndProc:如何在窗體最小化時獲得窗口消息
但是,當表單被最小化時,我不再收到任何消息。我知道它必須是這樣的,但是有沒有解決方法?我不希望隱藏窗體始終打開...
我最近還需要解決類似的問題。亞伯的回答讓我朝着正確的方向前進。這裏是我是如何做到的,通過改變正常的窗口,進入一個消息窗口只有一個完整的例子:
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?
如果您想要接收窗口消息,但不想顯示接收它們的窗體,則可以使用僅消息窗口,它從不顯示。如果使用它,則用於與用戶交互的實際C#表單不再需要從窗口服務接收消息。
Here's more on the subject as MSDN。一個警告雖然,它需要相當多的玩Window API,因爲一個純消息窗口不直接支持.NET。
你可以嘗試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
你一直在看'NC_ * '消息?就像標題欄中的懸停一樣,這也可能是「非客戶區」。另外:你是什麼意思的窗口消息?就像鼠標懸停在最小化的表單上一樣? – Abel