Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Если Вы не возражаете использовать Windows API, Вы могли бы использовать EnumWindowsProc
и проверить каждый из дескрипторов что, который поднимает использование GetWindowThreadProcessId
(чтобы видеть, что это находится в Вашем процессе), и затем возможно IsWindowVisible
, GetWindowCaption
и GetWindowTextLength
для определения, который hWnd
в процессе тот, который Вы хотите.
, Хотя, если Вы не использовали те функции перед, тот подход будет правильной болью, так надо надеяться, существует более простой путь.
@ageektrapped на правильном пути, однако FindWindow
не будет искать дочерние окна.
, Для которого необходимо будет использовать FindWindowEx
Можно найти что при вызове.Refresh (), что Вы получаете новое окно верхнего уровня.
Из того, что я понимаю MainWindowHandle
свойство процесса, который Вы запускаете, не допустимо. Если это так, можно использовать FindWindow
функция (от SDK Win32), который возвращается, окно обрабатывают Вас потребность. Все, в чем Вы нуждаетесь, является именем класса главного окна целевого приложения. Можно получить его с помощью Шпиона ++ или Winspector. Также необходимо удостовериться, чтобы у Вас было правильное окно путем проверки что идентификатор процесса окна с помощью GetWindowThreadProcessId
.
Наконец, я должен сказать, что я не эксперт по Win32 и могло бы быть лучшее решение для Вашего случая.
Используйте Процесс. GetProcessById (proc. Идентификатор); где proc был Вашим экраном-заставкой. Работы для меня.
Теперь, как пройти свойства главного окна в Системе. Windows. Формы для предоставления его фокусируют w/o, использующий win32? После того, как весь .net, как предполагается, является универсальным решением - он нет?
Если Вы знаете заголовок окна, можно использовать вызов Win32, FindWindow, через P/Invoke.
можно найти подпись здесь на pinvoke.net
Где-нибудь в коде, "реальное" главное окно создается. Можно просто сохранить дескриптор окна в то время и затем после завершений экрана-заставки, можно установить Приложение. MainWindow к реальному окну.
Свойство MainWindowHandle кэшируется после того, как к нему сначала получают доступ, который является, почему Вы не видите, что он изменяется даже после того, как дескриптор становится недопустимым. Информация GregUzelac корректна. Вызов Proces. Обновление будет заставлять следующий вызов Обрабатывать. MainWindowHandle для восстанавливания логики для нахождения нового дескриптора главного окна. Логика Michael также работает, потому что новый Процесс не имеет кэшированной версии MainWindowHandle.