ユーザーが新しいリボン タブを選択したときに、PowerPoint 2007 (または理想的には任意のバージョン) から UI オートメーション イベントをキャプチャしようとしています。SDK ツールの Inspect と AccEvent を使用して、これらのイベントをキャッチする妥当な「親」要素は「リボン タブ」要素であると判断しました。
AccEvent をその要素にスコープし、自動化イベント内で SelectionItem_ElementSelected に登録すると、期待どおりにイベントが取得されます。タブがクリックされると、AccEvent がそれをキャッチしてログに記録します。
私は 2 つのリンクのみを投稿することを許可されており、画像をインライン化することはまだできないため、できるだけ多くの関連情報を各リンクに絞り込むためにいくつかのモザイクを作成しました。上記の動作に関連するリンクは次のとおりです。
http://hirstius.com/media/stackoverflow/UIA_sdk_tools.png
それに基づいて、プログラムからこれらのイベントをキャッチする次のコードを思い付きました。
// Prior code gets foreground window, determines if it's PPT, and gets a handle to it
currentApp = AutomationElement.FromHandle(foregroundWindow);
// Create condition to find the "Ribbon Tabs" element
Condition propCondition = new PropertyCondition(
AutomationElement.NameProperty, "Ribbon Tabs",
PropertyConditionFlags.IgnoreCase);
// Subscribe to events on the "Ribbon Tabs" Element
SubscribeToEvents(currentApp.FindFirst(TreeScope.Descendants, propCondition));
public void SubscribeToEvents(AutomationElement element)
{
if (element != null)
{
Console.WriteLine("Subscribing to PowerPoint UIA Events on object {0} ({1})",
elementItem.GetCurrentPropertyValue(AutomationElement.NameProperty),
elementItem.GetCurrentPropertyValue(AutomationElement.AutomationIdProperty));
UIAeventHandler = new AutomationEventHandler(OnUIAutomationEvent);
// Subscribe to SelectionItemPattern.ElementSelectedEvent based off AccEvent
Automation.AddAutomationEventHandler(
SelectionItemPattern.ElementSelectedEvent,
element,
TreeScope.Descendants,
UIAeventHandler);
Console.WriteLine("Subscribed to PowerPoint UIA Events");
}
}
private void OnUIAutomationEvent(object src, AutomationEventArgs e)
{
// Make sure the element still exists
AutomationElement sourceElement;
try
{
sourceElement = src as AutomationElement;
}
catch (ElementNotAvailableException)
{
return;
}
Console.WriteLine("UIA Event ( {0} ) for item: {1}",
e.EventId.ProgrammaticName,
sourceElement.GetCurrentPropertyValue(AutomationElement.NameProperty));
}
このコードの結果は、まあ、何もありません。
トップレベルの「ウィンドウ」を購読しても、まだ何もありません。
代わりに、最上位の自動化要素をサブスクライブするだけで、予想されるイベントを取得できますが、問題があります。AccEvent では、イベントはタブがクリックされたとき、つまり真に「選択された」ときにのみ表示されます。ルート AutomationElement にバインドすると、マウスオーバー/ホバー時にイベントが発生し、クリック時には何も発生しません。タブが実際に選択されたときにのみイベントが発生する必要があります (これは、「リボン タブ」要素にスコープされたときに AccEvent が提示する動作とまったく同じです)。
結果リンク: http://hirstius.com/media/stackoverflow/UIA_Result.png
ユーザーがリボンの新しいタブを選択したときに .NET アプリケーションに通知する方法が必要ですが、明らかに不足していることはありますか?