4

Windows サービスから、既に実行中の Windows デスクトップ アプリケーションにメッセージを渡したいと考えています。Windows サービスにタイマーを実装しました。間隔の後、サービスは Windows アプリケーションにメッセージを送信します。

サービスまたは送信者コードは次のとおりです。

System.Diagnostics.Process[] lProcs = System.Diagnostics.Process.GetProcessesByName("TestProcess2");

        if (lProcs.Length > 0)
        {
            IntPtr handle = lProcs[0].MainWindowHandle;

            if (handle != IntPtr.Zero)
                SendMessage(handle, 232, IntPtr.Zero, IntPtr.Zero);
        }

Windows デスクトップ アプリケーション (レシーバー) コードは次のとおりです。

protected override void WndProc(ref Message m)
    {
        if (m.Msg == 232)
        {
            MessageBox.Show("Received");
        }
        else
        {
            base.WndProc(ref m);
        }
    }

両方のプロセスが Windows デスクトップ アプリケーションである場合、上記のコードは正常に動作します。Windows サービスを送信者として使用すると、Windows デスクトップ アプリケーション プロセスがメッセージを受信できません。助けてください。

4

3 に答える 3

4

サービスとデスクトップ アプリケーションは、2 つの異なる Window Station で実行されています。セキュリティ上の理由から、別々の Window Station で実行されているアプリケーション間でウィンドウ メッセージを送信することはできません。

サービスとデスクトップ アプリケーションの間で通信するには、ある種のプロセス間通信方法 (ソケット、名前付きパイプ、DCOM など) を使用するか、これらのいずれかの上で実行されるフレームワーク (リモーティングなど) を使用する必要があります。またはWCF。

于 2012-10-19T17:33:51.230 に答える
2

これは、2 つのプロセスが異なるユーザー アカウントで実行されているためだと思われます。

受信できるようにするには、メッセージフィルターの変更機能を使用する必要があると思います。こちらを参照してください。

ChangeWindowMessageFilterEx 関数

于 2012-10-19T14:20:22.427 に答える
0

これを行う 1 つの方法は、サービスで WCF インターフェイスをホストすることです。これにより、(潜在的に) 任意のアプリケーションとサービス間の通信が可能になります。

詳細な例については、次のリンクを参照してください。

http://www.codeproject.com/Articles/38160/WCF-Service-Library-with-Windows-Service-Hosting http://msdn.microsoft.com/en-us/library/ms733069.aspx

于 2012-10-19T14:36:13.290 に答える