フック関数の再入に対する保護
フック関数がイベントを処理している間に、追加のイベントがトリガーされる可能性があります。これにより、元のイベントの処理が完了する前にフック関数が再入力される可能性があります。 フック関数の再入の問題は、フック関数がこの状況を処理しない限り、イベントが順番に完了しないということです。
たとえば、スクリーン リーダー プログラムのフック関数が編集コントロールの EVENT_OBJECT_VALUECHANGE イベントを処理している場合を考えてみましょう。 最初の値変更イベントの処理中にフック関数が再入力されて後続の値変更イベントが処理された場合、2 番目のイベントは最初のイベントの前に完了します。 この状況により、スクリーン リーダーは不正確な情報をユーザーに伝えます。
イベント処理が中断されるため、フック関数が所有スレッドのメッセージ キューをチェックする関数を呼び出すたびに、追加のイベントが受信される可能性があります。 これは、フック関数内で次のいずれかが呼び出されたときに発生します。
- Windows SendMessage、 GetMessage、 PeekMessage、 DialogBox、または MessageBox 関数
- Microsoft Active Accessibility 関数 AccessibleObjectFromEvent、 AccessibleObjectFromWindow、 AccessibleObjectFromPoint
- プロセス境界を越える IAccessible インターフェイスまたはその他のコンポーネント オブジェクト モデル (COM) プロパティまたはメソッド
フック関数は AccessibleObjectFromEvent プロパティと IAccessible プロパティとメソッドを呼び出すので、再入を防ぐことはできません。 唯一の解決策は、クライアント開発者がフック関数にコードを追加して再入を検出し、フック関数が再入力された場合に適切なアクションを実行することです。