- PR -

RemoveMessageFilterメソッドについて

1
投稿者投稿内容
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-08-23 15:54
環境:WinXP SP2 .Net Framework2.0 Vb2005 パッチ全適用

RemoveMessageFilterメソッドの動作についてお聞きしたい事があります。
(System.Windows.Forms.Application)

あるアプリケーションで外部プロセスを起動している最中は、
キー入力を行えないようにフィルタを掛けるという処理を実装しました。

フィルタの実行・終了共に問題はないのですが、終了時にRemoveMessageFilterメソッドを
呼ぶタイミングによってはフィルタが解除されないという現象を確認しています。

その問題となるタイミングというのがProcess.Exitedイベント内です。
ちなみにプロセス起動時にAddHandlerにてイベントを利用するように行っています。

このイベント内で解除を行おうとした場合、RemoveMessageFilterメソッド自体は
動作している様子なのですがフィルタは解除されませんでした。

自分の認識としては、Exitedイベントで呼びだされているメソッドは呼び出し元
プロセス側なのでRemoveMessageFilterメソッドも呼び出し元に対して処理される
ものだ、という認識なのですが、この認識が誤っているのでしょうか?

よろしくお願いします。

# 修正:2007/08/23 16:12 開発環境が抜けていたのを修正

[ メッセージ編集済み 編集者: Ahf 編集日時 2007-08-23 16:12 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-08-23 16:41
ProcessのSynchronizingObjectに元フォームを設定でどうかしら。
詳細はMSDN参照。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2007-08-23 16:48
System.Windows.Forms.Application クラスの各メソッドは基本的に呼ばれたスレッドに依存性があります。

Process.Exited イベントは非同期(ワーカースレッドか内部に隠したスレッドか知らないけど)に発生すると思うので Process の SynchronizingObject を適切に設定するか、Control.Invoke/BeginInvoke を利用してみてください。

# 推測まじえてます。当たった?
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-08-23 17:05
なちゃさん、yaさんありがとうございます。

お二人の指摘通りSynchronizingObjectプロパティの設定で、想定していた動作になりました。

System.Windows.Forms.Application、というものだからプロセス単位なのかな、と
勘違いしていたのが問題だったようですね。

大変参考になりました。ありがとうございます。

1

スキルアップ/キャリアアップ(JOB@IT)