2014-01-08 62 views
4

我正在做一個C#窗體應用程序,使用System.Windows.Automation類自動化另一個win32應用程序。如何訪問UI Spy沒有看到用C#自動化一個win32應用程序的元素

有一些元素需要讀取或交互,但UISpy沒有找到這些字段,它只能找到父容器面板。

例如,下面這段代碼塊應該返回許多工具條按鈕,但不工作:

var mainWindow = AutomationElement.RootElement.FindChildByNamePart("Back Office Control"); 
var mainWindowChildren = mainWindow.FindAll(TreeScope.Children, Condition.TrueCondition); 
var toolBarPanel = mainWindowChildren[1]; 
var toolBarItens = toolBarPanel.FindAll(TreeScope.Children, Condition.TrueCondition); 

還有另一種方式來做到這一點?

回答

2

正如你剛剛發現,工具條按鈕實際上不在Windows消息世界獨立控制。菜單項和其他一些控件也是如此。

要使用Windows消息進行點擊,您需要將WM直接發送到工具欄,而不是按鈕,例如TB_PRESSBUTTON(http://msdn.microsoft.com/en-us/library/windows/desktop/bb787389(v=vs.85).aspx)。

您必須使用 WinAPI函數,以工具欄爲目標(您可以像往常一樣獲取hWnd),其中TB_PRESSBUTTON作爲消息類型,命令標識符爲wParam,1作爲lParam。

+0

感謝您的回覆,這真的很有用,您知道如何從數據網格控件中的特定單元格獲取值嗎? – rcarubbi

+0

@rcarubbi我擔心數據網格不是標準的Windows控件,因此您可能需要深入挖掘您試圖控制的實際應用程序。它在.NET WinForms,MFC中...? – Luaan

+0

我不知道,我想它是用Delphi編譯的...這是一個非常古老的應用程序。 – rcarubbi

0

您需要使用Win32調用來實現此目的。 GetWindow做它

幫助信息 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms633515%28v=vs.85%29.aspx

[DllImport("user32.dll")] public static extern int GetWindow(int hwnd,int wCmd); 
+0

命名空間System.Windows.Automation中的類在幕後執行此操作。我發佈的代碼塊的第一行完全一樣的工作。 var mainWindow = AutomationElement.RootElement.FindChildByNamePart(「Back Office Control」);不幸的是,我面臨的問題比深入瞭解窗口更深。 – rcarubbi

相關問題