次の方法で共有


UI オートメーション イベントのサブスクライブ

Microsoft UI オートメーションを使用すると、クライアントは関心のあるイベントをサブスクライブできます。 この機能により、システム内の UI 要素を継続的にポーリングして、情報、構造、または状態が変更されたかどうかを確認する必要がなくなるため、パフォーマンスが向上します。

また、定義されたスコープ内のイベントだけをリッスンできるため、効率性も向上します。 たとえば、クライアントは、リスト内のアイテム、リスト自体、またはダイアログ ボックス全体で選択の変更をリッスンできます。

注意

考えられるすべてのイベントがUI オートメーション プロバイダーによって発生するとは限りません。 たとえば、すべてのプロパティ変更によって、Windows フォームコントロールと Microsoft Win32 コントロールの標準プロキシ プロバイダーによってイベントが発生するわけではありません。

 

UI オートメーション イベントの概要については、「UI オートメーション イベントの概要」を参照してください。

注意

イベント ハンドラーを実装する前に、「スレッドの問題について」で説明されているスレッドの問題 について理解しておく必要があります。

 

このトピックは、次のセクションで構成されています。

イベント ハンドラーの登録

クライアント アプリケーションは、次のいずれかの IUIAutomation メソッドを使用して、イベント ハンドラーを登録することで、特定の種類のイベントをサブスクライブします。

Subscription メソッド イベントの種類 コールバック インターフェイス
AddFocusChangedEventHandler フォーカスの変更 IUIAutomationFocusChangedEventHandler
AddPropertyChangedEventHandlerAddPropertyChangedEventHandlerNativeArray プロパティの変更 IUIAutomationPropertyChangedEventHandler
AddStructureChangedEventHandler 構造の変更 IUIAutomationStructureChangedEventHandler
AddNotificationEventHandler 通知 IUIAutomationNotificationEventHandler
AddAutomationEventHandler その他のイベント IUIAutomationEventHandler

 

クライアントがすべての子孫 (TreeScope_Descendants) のイベント ハンドラーを追加すると、UI オートメーションはサブツリーのルートに対して 1 つのハンドラーのみを追加し、ハンドラーはすべての子孫をリッスンします。 UI オートメーションでは、イベント ハンドラーは再帰的に追加されません。

クライアントが IUIAutomation::RemoveAllEventHandlers メソッドを呼び出すと、UI オートメーションはクライアント プロセスからすべてのイベント ハンドラーを削除します。

イベントを受信して処理するには、コールバック インターフェイスを公開するイベント処理オブジェクトを実装し、 IUIAutomation::AddPropertyChangedEventHandler などのイベント登録メソッドを呼び出してオブジェクトを登録する必要があります。 コールバック インターフェイスには 1 つのメソッドがあります。UI オートメーションは、イベントが処理されるときにこのメソッドを呼び出します。

シャットダウン時、またはUI オートメーションイベントがアプリケーションに関心を持たなくなった場合、UI オートメーションクライアントは次の IUIAutomation メソッドを 1 つ以上呼び出す必要があります。

Note

UI オートメーション クライアントでは、イベント ハンドラーを追加または削除するために複数のスレッドを使用しないでください。 同じクライアント プロセスで別のイベント ハンドラーが追加または削除されている間に、1 つのイベント ハンドラーが追加または削除されると、予期しない動作が発生する可能性があります。

 

メソッド 説明
RemoveAutomationEventHandler AddAutomationEventHandler を使用して登録されたイベント ハンドラーの登録を解除します。
RemoveFocusChangedEventHandler AddFocusChangedEventHandler を使用して登録されたイベント ハンドラーの登録を解除します。
RemovePropertyChangedEventHandler AddPropertyChangedEventHandler または AddPropertyChangedEventHandlerNativeArray を使用して登録されたイベント ハンドラーの登録を解除します。
RemoveStructureChangedEventHandler AddStructureChangedEventHandler を使用して登録されたイベント ハンドラーの登録を解除します。
RemoveNotificationEventHandler AddNotificationEventHandler を使用して登録されたイベント ハンドラーの登録を解除します。
RemoveAllEventHandlers 登録済みのすべてのイベント ハンドラーの登録を解除します。

 

イベントをサブスクライブ解除する要求と同時にイベントを受信した場合、ハンドラーの登録を解除した後にイベントをイベント ハンドラーに配信できます。 ベスト プラクティスは、コンポーネント オブジェクト モデル (COM) 標準に従い、参照カウントが 0 になるまでイベント ハンドラー オブジェクトを破棄しないようにすることです。 イベントのサブスクライブを解除した直後にイベント ハンドラーを破棄すると、イベントが遅れて配信された場合にアクセス違反が発生する可能性があります。

UI オートメーション イベントの処理方法を示すコード例については、「イベント ハンドラーを実装する方法」を参照してください。

概念

UI オートメーション イベントの概要

スレッドの問題について