2

一部のウィンドウ (私の場合は VLC プレーヤー ウィンドウ) から送信された Windows システム メッセージ (WM_SETTEXT など) をトラップするにはどうすればよいですか? NativeWindow クラスを継承し、次のように WndProc をオーバーライドしようとしました。

class VLCFilter : NativeWindow
{
    System.IntPtr iHandle;
    const int WM_SETTEXT = 0x000C;

    public VLCFilter()
    {
        Process p = Process.GetProcessesByName("vlc")[0];
        iHandle = p.MainWindowHandle;
    }

    protected override void WndProc(ref Message aMessage)
    {
        base.WndProc(ref aMessage);

        if (aMessage.HWnd != iHandle)
        return false;

        if (aMessage.Msg == WM_SETTEXT)
        {
            MessageBox.Show("VLC window text changed!");
        }
    }
}

WM_SETTEXT メッセージが VLC プレーヤーによって送信されることを Microsoft Spy++ で確認しましたが、私のコードでは作業が完了していないようです。私は主に参照しました: http://www.codeproject.com/kb/dotnet/devicevolumemonitor.aspx

私はこれをしばらくの間成功させようとしています。私は何を間違っていますか?私がしていないことは何ですか?多分これを行う簡単な方法はありますか?

私の最初の目標は、VLCプレーヤー(バックグラウンドのどこかで再生され、アプリケーションに埋め込まれていない可能性があります)が再生を繰り返すときにキャッチすることです(WM_SETTEXTメッセージが送信されることに気づき、このように見つけようとしています) .

4

5 に答える 5

1

フックテクニックを使用できると思います 。そのような場合のために設計されています。

また、このリンクは簡単にググることができますが、役に立つ可能性があります。 http://www.codeproject.com/KB/cs/netwin32hooks.aspx http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx

于 2010-05-27T10:07:51.277 に答える
1

あなたのコードに到達していますか?から継承しNativeWindowたと思いますが、実際のウィンドウをVLCFilterクラスから継承していません。おそらく書き直さなければならないので、これは実際には非常に難しいことになるでしょうSystem.Windows.Forms.Form...(そこには継承があると思いますが、フレームワークの内部構造は正直わかりません。)

おそらく、Form代わりに から継承し、フォームを の代わりに新しいクラスから継承する必要がありFormます。

于 2010-05-27T09:35:54.577 に答える
1

こんにちは、あなたの答えに感謝します。;) に続いて: http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspxはトリックを行い、今では私が望んでいたイベントに接続しています。すべて正常に動作しますが、1 つだけ問題があります。WndProc をオーバーライドすると、フォームが作成されるとすぐにメッセージの受信が開始されます。WndProc がこれらのメッセージを受信するのを一時的に無効にし、それらを取得したい場合にのみ有効にする方法はありますか?

于 2010-05-29T17:55:18.517 に答える
0

コードのどこかで、NativeWindow.AssignHandleを呼び出す必要があります。そうでない場合 (または間違ったハンドルを渡している場合)、オーバーライドWndProcされたものは呼び出されません。

編集:ただし、VLC は別のプロセスで実行されているため、この手法は機能しません。NativeWindow.AssignHandleメソッドのドキュメントには、次のように記載されています。

注: 割り当てるハンドルは、別のアプリケーション プロセスにあることはできません。

于 2010-05-27T10:02:48.820 に答える
0

基本実装への呼び出しの前に作業を行ってください。そうしないと、値Messageが変更される可能性があります。

于 2010-05-27T09:35:07.980 に答える