6

特定のサービスと通信するには、WindProc. ウィンドウメッセージを受け取ります。

ただし、フォームを最小化すると、メッセージが表示されなくなります。そのようにしなければならないことはわかっていますが、これに対する回避策はありますか? 常に開いたままの非表示のフォームは使いたくない...

4

3 に答える 3

10

最近、同様の問題を解決する必要もありました。アベルの答えは私を正しい方向に導きました。通常のウィンドウをメッセージのみのウィンドウに変更する方法の完全な例を次に示します。

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 フォームからメッセージのみのウィンドウを作成するにはどうすればよいですか?

于 2011-08-11T21:55:20.140 に答える
3

ウィンドウ メッセージを受信したいが、それらを受信するためのフォームを表示したくない場合は、表示されないメッセージのみのウィンドウを使用できます。これを使用すると、ユーザーと対話するために使用する実際の C# フォームは、ウィンドウ サービスからメッセージを受信するために必要なくなります。

これについては、MSDN として詳しく説明しています。ただし、メッセージのみのウィンドウは .NET で直接サポートされていないため、ウィンドウ API をいじる必要があります。

于 2011-07-22T07:42:27.250 に答える
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
于 2013-04-20T21:06:34.057 に答える