Есть ли способ убедиться, что «Windows_run()», импортированный из WindowsAccessBridge, завершил работу?C#

Место общения программистов C#
Anonymous
Есть ли способ убедиться, что «Windows_run()», импортированный из WindowsAccessBridge, завершил работу?

Сообщение Anonymous »

По сути, я разрабатываю приложение WPF, которое использует WindowsAccessBridge.dll для вывода списка всех активных окон Java. Когда я инициализирую свой класс автоматизации Java, я вызываю импортированный метод Windows_run():

Код: Выделить всё

[DllImport(WinAccessBridgeDll, SetLastError = true, ThrowOnUnmappableChar = true, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
private extern static void Windows_run();
Затем все дескрипторы окон извлекаются в другой части моего проекта, и для каждого дескриптора я вызываю следующее:

Код: Выделить всё

public IElement? FindWindowFromHandle(IntPtr handle)
{
if (IsJavaWindow(handle) != 1)
return null;
unsafe
{
if (GetAccessibleContextFromHWND(handle, out Int32 VmID, out IntPtr javaWindowHandle) && javaWindowHandle != IntPtr.Zero)
return new JavaElement(VmID, javaWindowHandle);
}
return null;
}
Проблема в том, что при первом вызове метода IsJavaWindow() возвращает 0 даже для дескрипторов, которые действительно соответствуют элементам Java. Если я затем снова вызову тот же метод, используя тот же дескриптор и ничего больше не меняя, он действительно будет работать так, как задумано.
После долгой отладки мой единственный логический вывод заключается в том, что первый Когда вызывается FindWindowFromHandle(), мой класс автоматизации Java еще не инициализирован должным образом. К сожалению, Windows_run() недействителен, поэтому, похоже, нет способа убедиться, что он загрузился должным образом.
Я попробовал несколько обходных путей, которые, кажется, исправляют проблему. проблема, например добавление кнопки, которая запускает FindWindowFromHandle() вместо ее вызова непосредственно после инициализации, или открытие MessageBox непосредственно перед первым вызовом. Однако я не хочу зависеть от какого-то произвольного способа ожидания. Мне нужно убедиться, что он будет искать окна Java только после правильной загрузки. Есть ли способ сделать это?

Подробнее здесь: https://stackoverflow.com/questions/791 ... accessbrid

Вернуться в «C#»