Com 相互運用機能を介して UI オートメーションを使用する C# プログラムを作成しています。ただし、別のイベント ハンドラー内からイベント ハンドラーを追加/削除する際に問題が発生しています。
私のプログラムは新しい MTA スレッドを開始し、そのスレッドで AddFocusChangedEventHandler() を呼び出します。
フォーカスされた要素のプロパティの変更を監視したい。そのため、フォーカスが変更されたハンドラー内で、以前にフォーカスされていた要素に対して RemovePropertyChangedEventHandler() を呼び出し、新しくフォーカスされた要素に対して AddPropertyChangedEventHandler() を呼び出します。
ただし、約 2 回のフォーカス変更の後、フォーカス変更イベントまたはプロパティ変更イベントのいずれかが発生しなくなることがわかりました。私の推測では、何かがバックグラウンド スレッドをブロックしているようです。
プロパティが変更されたコードを削除すると、フォーカス トラッキングだけが期待どおりに機能します。
これが適切かどうかはわかりませんが、ドキュメントには、イベントハンドラーを同じスレッドで追加/削除する必要があると記載されています。あるフォーカス変更イベントで AddPropertyChangedEventHandler() を呼び出し、別のフォーカス変更イベントで RemovePropertyChangedEventHandler() を呼び出しているため、2 つの呼び出しが異なるスレッドで実行されている可能性があります。ただし、これが事実であるとは思えません。たとえそうであったとしても、私が見ているブロッキング動作を示すべきではありません。完全を期すためにここで言及するだけです。