2011-02-08 8 views
1

私はWin32_VolumeChangeEventを処理し、USBディスクデバイスの到着をイベントログとSQLデータベースに記録するWindowsサービスを用意しています。この追加コンポーネントは、ログイン時にユーザーセッションに読み込まれる非表示のUI(WinForms)です。これは、USBキーなどに関する会社のポリシーをユーザーに思い出させるメッセージボックスを表示します。AFAIK、これはサービスができないインタラクティブモードで長時間実行する。C#イベントのIPC全体

アーキテクチャ上、この小さなもののv1はUIコンポーネントがデバイス挿入用のWndProcメッセージを処理した後、IPC(名前付きパイプ)を介してデバイス識別子をWMIメソッド/ EventLogの書き込みを処理するサービスに渡したすべてのユーザーがローカル管理者権限を持っているわけではないため)。これは、UI要素の欠点が、プロセスが終了し、もはやデバイスの挿入を検出していないことを意味する。

現在のバージョンでは、サービスがWin32_VolumeChangeEventsを処理し、デバイスから必要な詳細を取得してから、EventLogとSQLにログを記録します。すべては抜群で、完璧に機能します。私はポップアップを表示するUIをトリガする最良の方法は何ですか?

私はIPCでのイベントに関するアイデアを探していますので、UIコンポーネントのイベントを購読してサービス内で起動することができますが、役に立った私はまた.net2に拘束されているので、WCFは画像から外れています(しかし、あなたがそのようにしたいなら、私はp/invokeを恐れません)。

So.どうしますか?リンク、思考、言葉遣い、擬似コード、実際のコード...すべてが評価されます。私はベストプラクティスであると信じているものに固執しようとしていますが、プログラミングはちょっとした芸術形式で、ベストプラクティスは誰かのホラーストーリーかもしれません。

だからあなたは何をしますか?私が明確にする必要がある場合私に教えてください:)

+1

これは、WCFでは比較的簡単です。なぜあなたは.NET 2に制約されていますか? .NET 3.0と3.5は.NET 2のスーパーセットであり、実際に別のバージョンではなく、コアアセンブリを変更しないことはご存じですか? –

+0

私たちは.net 3のインストールの良いクライアント側のカバレッジを持っていませんが、私たちは.net 2のインストールのほぼ完全なカバレッジを持っています。ネットを押すことは現時点では選択肢ではありません。 – dotalchemy

答えて

3

悪い昔のWindows APIプログラミングでは、時にはRegisterWindowMessageを使用して、私たちのウィンドウだけが処理方法を知っていたユニークなメッセージIDを登録することがありました。 HWND_BROADCASTというウィンドウハンドルを持つPostMessageを呼び出し、msgというパラメータをその一意のメッセージ値として呼び出すことによって、別のアプリケーションからそのウィンドウを起動させることができます。プロセス間で共有したいものが2つのDWORDの値(wparamlparam)に収まる場合は、これは素晴らしいことです。大域メモリを割り当て、パラメータの1つとして参照を渡すと、より多くのデータを共有できます。

これは.NETでも可能です。確かに問題がないのでPostMessageと呼んでください。 UIコード内のメッセージを処理する場合は、フォームのWndProcをオーバーライドする必要があります。例については、How do I send/receive windows messages between VB6 and c#?を参照してください。

名前付きイベントで何かできますが、これはUIに変更が発生したことを通知するだけです。何が起こったのかは実際には分かりません。私は、可能性のあるイベントの数が少ない場合は、複数のイベントを持つことができますが、それは非常に迅速に複雑になります。

名前付きイベントルートを行くと状態を共有するための共有メモリ(メモリマップされたファイル)を使用することができます。

または、ソケット、名前付きパイプ、TcpListener/TcpClient、さらにはUdpClientを設定することもできます。さまざまな程度の複雑さや信頼性で、すべてが機能するはずです。

+1

良いオプション。残念なことに、PostMessageらはSession0の境界を越えず、レベル間でメッセージを送信する場合にはあらゆる種類のWindowsを対象としています。私は指定されたイベントとソケットを再度調査します。すぐに両方の回答をマークし、さらにルックアライメントを受け入れます。 – dotalchemy

+1

あなたは私に多くの良いことを考えさせました。最終的に、私はWindowsにその小さなメッセージの洪水のことをして、本質的に2つの別々のアプリケーションとしてそれらを実装したときに複数のポップアップを避けるためにタイムスタンプでUIにWndProcをキャプチャしました(v1のように)。その目的を果たします。それでも、あなたは今日の素晴らしい旅に私を連れて行きました。異なるアイディアを持ち、異なるコードを見ていました。提案していただきありがとうございます! – dotalchemy

1

私の心に来る唯一のアイデアは、UIアプリケーションの状態を定期的にチェックし、それが殺された場合に再起動することです。ユーザーのセッション内で実行される標準モジュールは存在しないと思われ、サービスがこのモジュールに通知を送信するようにします。サードパーティのソリューションが存在しますが、使用するためにインストールする必要はありません。

更新:質問を再読み込みした後でUIがWindowsメッセージを受信しない可能性がありますので、別の仕組みが必要です。サービス中のSemaphore同期オブジェクトを作成し、UIプロセス(別のスレッド)で待機してみませんか?

+0

私にはっきりさせてください - 私は既にUIコンポーネントを持っています。これはコンパイルして正常に動作する別のWinFormsプロジェクトです。サービスが引き続きデバイスの到着を記録するため、再起動することは問題ではありません。挿入に反応するUI(実行中の場合)を教えてください。 – dotalchemy

+0

@dotalchemy今私は混乱しています。あなたは「これはUI要素の欠点があり、プロセスが終了し、もはやデバイスの挿入を検出していない」と書いています。あなたのコメントは、引用されたステートメントを否定します。 –

+0

それはバージョン1の欠点でした。なぜなら、サービスがデバイスの到着を処理し、ポップアップメッセージを表示するためにUIが必要となるように書き換えたからです。 – dotalchemy

関連する問題