2017-02-14 8 views
1

私はUIオートメーションプログラムを作成するのにC#を使用したいが、 "Inspect.exe"でいくつかの要素を見つけることができない。テキストラベル(例:image1)の画像を見つけることができない。"Inspect.exe"を使用していくつかの要素を見つけることができません、なぜですか?

画像1:https://i.stack.imgur.com/NqpKA.png

画像2:https://i.stack.imgur.com/2PIuj.png

コードサンプル:

var desktop = AutomationElement.RootElement; 

var condition = new PropertyCondition(AutomationElement.NameProperty, "Customer Register"); 

var window = desktop.FindFirst(System.Windows.Automation.TreeScope.Children, condition); 

答えて

0

あなたは要素を取得するために掲載のコードは、私が点検からあなたのスクリーンショットで見ることができるものから正しいです。テキストのエンコーディングが原因で、UIオートメーションが名前を取得していないと感じています。ソースへのアクセス権がなく、取得方法がわからない場合や、ラベルのテキストを設定する場合は、UIオートメーションを使用してテキストを取得することはできません。

あなたが持っているコードを使用して、win32 APIを使ってウィンドウをネイティブウィンドウハンドルで使用してテキストを取得することができます。

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [Out] StringBuilder lParam); 
public static string GetWindowTextRaw(IntPtr hwnd) 
{ 
    // Allocate correct string length first 
    int length = (int)SendMessage(hwnd, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero); 
    StringBuilder sb = new StringBuilder(length + 1); 
    SendMessage(hwnd, WM_GETTEXT, (IntPtr)sb.Capacity, sb); 
    return sb.ToString(); 
} 

public static void YourMethod() 
{ 
    var desktop = AutomationElement.RootElement; 

    var process = Process.Start("Path/To/Your/Process.exe"); 

    var condition = new PropertyCondition(AutomationElement.ProcessId, process.Id); 

    var window = desktop.FindFirst(System.Windows.Automation.TreeScope.Children, condition); 

    var windowTitle = GetWindowTextRaw(window.NativeWindowHandle) 
} 

出典:

GetWindowText
SendMessage

+0

は非常にあなたの答えをありがとうございましたが、これは答えではありません。私はそれがパネルコントロールであることを見つける "スパイ+ +"を使用して、ただ1つのパネルハンドルがあります。 DrawStringメソッドの ".Net System.Drawing"ネームスペースによって、ラベルテキストをペイントする必要があります –

関連する問題