2012-03-06 9 views
1

私はかなり長い間探してきましたが、これを行うには良い方法が見つからないようです。ウィンドウレスのC#プロセスでのWM_イベントの処理

基本的には、WPF(可視ウィンドウなし)を使用するC#プロセスがあり、WM_イベントを処理する必要があります(たとえば、WM_CLOSEまたはWM_DESTROYなど)。ユーザーがログオフするときにエレガントにシャットダウンできるようにします。またはマシンを再起動します)。

System.Windows.InteropServicesを使用してAddHookを呼び出して、WndProcになる関数へのポインタを指定することをお勧めするいくつかのソリューションがあります。この問題は、私が知る限り、実際に表示されているウィンドウに依存します(この場合はウィンドウがありません)。

提案されているが動作しない別の方法は、WinFormのWndProcメソッドをオーバーライドすることですが、このプロセスには表示されるフォームやウィンドウがありません。

メッセージ専用ウィンドウを参照しているものも見つかりました。まだWM_イベントを受信して​​いるインビジブルウィンドウのようなものです。私が見たことから、これはMicrosoft.WindowsCE.Formsアセンブリでのみ利用可能です。私のプロジェクトでこのアセンブリへの参照を追加し、次のようにMessageWindowをサブクラス化しました:http://msdn.microsoft.com/en-us/library/microsoft.windowsce.forms.messagewindow.aspxしかし、それでも動作しないようです。 WndProc内のブレークポイントはヒットしていません。

ヒント?

+0

のように非表示のウィンドウを作成できます。私はそのレベルでプレイしてからしばらくしていますが、HWNDには0を使用していますどこかのデスクトップのHWNDだった)。検証するために私のアーカイブを掘り下げなければならないだろうが、私はこれがうまくいくと確信している。 –

答えて

1

あなたがウィンドウを持っていない場合、アプリケーションがウィンドウメッセージを受け取る方法(メッセージがウィンドウのハンドルに送られることを考慮して)を考えてみてください。

「メールアドレスを使用せずにメールを受け取る方法は?」

Michael Entinは、シャットダウン時のウィンドウの動作をカバーしますhere

ユーザーのログオフ時に、ユーザーのセッションで実行されているすべてのプロセスが自動的に閉じられることを99%確信しているので、これは問題ではありません。このウィンドウのメッセージを本当に処理しなければならない場合は、Any way to create a hidden main window in C#?

+0

Chrisが正しいです。アプリケーションが尋ねられたときにシャットダウンすることを防ぐことができない限り、それはきれいに閉じるべきです。したがって、次の質問は、Windowsサービスではなくウィンドウレスのバックグラウンドアプリとしてアプリを書く理由です。 –

+0

@RichardTurner - WindowsサービスがWindowsイベントをフックできるようになるにはどうしますか? –

+0

@ M.Babcock彼は 'WM_CLOSE'や' WM_DESTROY'以外のキーイベントやマウスイベントを扱うことは言及していません(おそらく彼はアプリケーションをシャットダウンするだけでよいと指摘しています)。 –

関連する問題