Использование "Inspect.exe" не может найти некоторые элементы, почему?
Я хочу использовать C# написать программу автоматизации пользовательского интерфейса, но я не могу найти некоторые элементы с помощью "Inspect.exe". Не могу найти изображения текстовых меток (например, image1), почему?
image1:
Пример кода:
var desktop = AutomationElement.RootElement;
var condition = new PropertyCondition(AutomationElement.NameProperty, "Customer Register");
var window = desktop.FindFirst(System.Windows.Automation.TreeScope.Children, condition);
1 ответ
Код, который вы разместили для получения элементов, верен из того, что я вижу на вашем снимке экрана от inspect. У меня такое ощущение, что UI Automation не возвращает имя из-за кодировки текста. Если у вас нет доступа к источнику, и вы не можете связываться с тем, как он получает и устанавливает текст для этих меток, получить текст с помощью автоматизации пользовательского интерфейса будет невозможно.
Вы можете использовать код, который у вас есть, и использовать собственный дескриптор окна для окна с API win32, чтобы получить текст.
[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)
}
Источники: