特定のサービスと通信するには、WindProc
. ウィンドウメッセージを受け取ります。
ただし、フォームを最小化すると、メッセージが表示されなくなります。そのようにしなければならないことはわかっていますが、これに対する回避策はありますか? 常に開いたままの非表示のフォームは使いたくない...
最近、同様の問題を解決する必要もありました。アベルの答えは私を正しい方向に導きました。通常のウィンドウをメッセージのみのウィンドウに変更する方法の完全な例を次に示します。
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 メソッドが呼び出されません。理由がわからないので、おそらく誰かが理由を説明できます。
私のサンプル コードも関連する質問に答えると思います: Windows フォームからメッセージのみのウィンドウを作成するにはどうすればよいですか?
ウィンドウ メッセージを受信したいが、それらを受信するためのフォームを表示したくない場合は、表示されないメッセージのみのウィンドウを使用できます。これを使用すると、ユーザーと対話するために使用する実際の C# フォームは、ウィンドウ サービスからメッセージを受信するために必要なくなります。
これについては、MSDN として詳しく説明しています。ただし、メッセージのみのウィンドウは .NET で直接サポートされていないため、ウィンドウ API をいじる必要があります。
メッセージの受信を試みることができ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