0

私は問題 (アプリケーション内で開いているフォームを検出する方法) に取り組んでおり、理解できない Windows メッセージに出くわしました: 0xC052。

これは、フォームが開いたときに MessageFilter で受け取る最初のメッセージです。しかし、参照が見つからなかったので、フォームが開かれたことをメッセージが信頼できると言っているという仮定に頼りたくありません。

編集:コードを追加

Application.AddMessageFilter(new MessageFilterImpl());

class MessageFilterImpl : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        Control wnd = Form.FromHandle(m.HWnd);
        if (wnd is Form)
            knownForms.Add((Form)wnd); //m.Msg is 0xC052

        return false;
    }
}
4

1 に答える 1

1

これが整形式の Windows メッセージであると仮定すると、これはRegisterWindowMessage関数から返された動的に割り当てられた ID です (範囲に注意してください0xC000-0xFFFF)。この関数は、システム固有であるはずの新しい Windows メッセージを定義する必要がある場合に使用されます。つまり、ID に依存することはできません。次に再起動すると ID が異なります。

.NET Winforms はこれを内部で何度も使用します。これは、動作の良い Windows アプリケーション フレームワークです。したがって、見つけた正確な数は、おそらく次のようなものに対応する可能性があります。

  • スレッド コールバック (Invokeおよびフレンド)
  • マウス入力メッセージ
  • コントロール名を取得 ( Name)

もちろん、.NET メッセージである必要はありません。たとえば、すべてのフォームにメッセージをブロードキャストするアプリケーションがシステム上にある場合があります。これは RPC を処理する一般的な方法です (私の場合、受信したフォームは egMSUIM.Msg.RpcSendReceiveです)。

于 2015-09-21T08:24:54.430 に答える