FindWindow не возвращает IntPtr.Zero, хотя окно уже закрыто - PullRequest
1 голос
/ 27 сентября 2010

Я пытаюсь управлять приложением Java из моей программы на C #.Перед тем, как программа начинает вводить данные, она проверяет наличие каких-либо предыдущих окон ввода данных и пытается закрыть их.

Код для проверки существования окна:

public static bool WindowExists(string WindowName)
{
    IntPtr hWnd = FindWindow(null, WindowName);
    return (hWnd != IntPtr.Zero);
}

До сих пор я просто использовал этот метод в цикле while (отправляя Alt + F4 в окна), пока не осталось открытого окна ввода.

Некоторое время назад приложение Java получило обновление, и этот методбольше не работает.По какой-то причине WindowExists продолжает возвращать true, даже после закрытия окна ввода данных.Это происходит только в том случае, если окно ввода существовало хотя бы один раз.

Я даже пытался добавить Thread.Sleep () в цикл, чтобы убедиться, что это не вызвано некоторой задержкой в ​​приложении Java, но ононе работал

Иногда простой вызов WindowExists приводит к сбою окна ввода.

Нет проблем с кодом, потому что он работал раньше, и он все еще работает с другими программами, поэтому это должно быть проблемой с обновлением в программе Java.

Есть ли какие-либоАльтернативный / более надежный способ проверить, существует ли окно?Изменение отправки Alt + F4 на «событие закрытия окна» также может стоить попробовать, но я не знаю, как отправить это событие в окно другой программы.

Я новичок, поэтому, пожалуйста, оставьте ответ простым,

Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 27 сентября 2010

Я бы использовал Spy ++ , чтобы посмотреть дескриптор окна приложения Java и посмотреть, сможете ли вы выяснить, что еще происходит - я согласен, что должен быть способ сообщить, что оно закрыто .

Я предполагаю, что просмотр списка процессов невозможен ...

0 голосов
/ 27 сентября 2010

Попробуйте выполнить дополнительную проверку, используя IsWindow API, для значения hWnd, возвращаемого FindWindow.

0 голосов
/ 27 сентября 2010

Создание / удаление окон находится вне вашего контроля.Если вы хотите надежно обнаружить присутствие «кого-то еще», используя тот же ресурс, который вы хотите, попросите другую сторону сообщить об этом явно.

Другая сторона может сообщить о своем присутствии, создав файл, открыв порт, что угодно, и может отпустить / удалить / закрыть его при выходе.

0 голосов
/ 27 сентября 2010

Я предполагаю, что либо окно не было полностью удалено Java-кодом / VM, либо оно обрабатывает Alt + F4 каким-то особым образом (то есть, возможно, делает себя невидимым, а не закрывается).

0 голосов
/ 27 сентября 2010

Я бы рискнул предположить, что во время работы приложения Java и, следовательно, JVM, «дескриптор» окна еще не был собран, и поэтому базовый механизм указателей по-прежнему действует.

Если бы я писал эти вещи (и если бы я мог изменить код Java), я бы, вероятно, добавил средство запроса к java-приложению, чтобы увидеть, отображаются ли его окна. Интерфейс сокетов или что-то.

...