0

このアプリケーションには、動的に作成される多くのコントロールがあります。たとえば、ナビゲーションペインには、ユーザーがアプリ内を移動すると変化するリンクのグループが含まれています。初めてAccExplorerを使用してこれらのリンクを選択すると、完全に検出されます。ただし、別のページに移動した後、AccExplorerは更新されたナビゲーションペインにリンクを表示できません。実際、古いリンクコントロールは引き続きAccExplorerツリー階層に表示され、それらをクリックすると、AccExplorerはアプリケーションの実際のウィンドウの境界外にあるデスクトップの領域を強調表示します。

コントロールは変更されましたが、AccExplorerはそれらを認識しません。それでも、階層は同じであると考えています。

私が奇妙だと思うのは、AccExplorerを閉じてから、AccExplorerの新しいインスタンスを開くと、同じ結果になることです。AccExplorerで新しいナビゲーションコントロールを選択すると、新しいリンクが表示されません。古いリンクで古い階層を再作成します。新しいリンクを表示する唯一の方法は、アプリケーションを閉じてアプリケーションを再度開き、手動で新しいページに移動してから、AccExplorerでコントロールを選択することです。

ナビゲーションコントロールはDevExpressコントロールです。OSはWinXPです。AccExplorer2.0。UIAutomationを使用したいのですが、すべてのDevExpressコントロールがUIAutomationをサポートしているわけではありません。これらのギャップを埋めるためにMSAAを使用しようとしています。

4

1 に答える 1

0

フォローアップするには...

UISpyを使用すると、AccExplorerが認識できないLeftNavExplorerBarGroupsというコントロールを見つけることができます。UIAutomationを使用してコントロールのウィンドウハンドルを取得し、そのハンドルを使用してMSAALayerでIAccessibleオブジェクトを見つけることができます。AccExplorerがそのコントロールを認識できず、accNameがnullであるという事実により、必要なコントロールを見つける方法を見つけるのが非常に困難になりました。(注:MSAAはArshadからのものです-http: //www.codeproject.com/KB/winsdk/MSAA_UI_Automation.aspx

AutomationElement a, b;
Process p;
Process[] existingProcesses;
IAccessible c;

existingProcesses = Process.GetProcessesByName("OurApp");
if (existingProcesses.Length > 0) {
  p = existingProcesses[0];
  a = AutomationElement.FromHandle(p.MainWindowHandle);
  b = a.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, "LeftNavExplorerBarGroups"));
  c = MSAA.GetAccessibleObjectFromHandle(new IntPtr(b.Current.NativeWindowHandle));
}
于 2009-08-20T23:00:07.557 に答える