2009-08-18 6 views
0

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

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

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

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

をフォローアップする

答えて

0

私は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)); 
} 
関連する問題