.NET (C#): Получение дочерних окон, когда у Вас только есть дескриптор процесса или PID?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
22
задан Rudi Visser 1 March 2013 в 17:59
поделиться

8 ответов

Если Вы не возражаете использовать Windows API, Вы могли бы использовать EnumWindowsProc и проверить каждый из дескрипторов что, который поднимает использование GetWindowThreadProcessId (чтобы видеть, что это находится в Вашем процессе), и затем возможно IsWindowVisible, GetWindowCaption и GetWindowTextLength для определения, который hWnd в процессе тот, который Вы хотите.

, Хотя, если Вы не использовали те функции перед, тот подход будет правильной болью, так надо надеяться, существует более простой путь.

10
ответ дан Rudi Visser 29 November 2019 в 05:32
поделиться

@ageektrapped на правильном пути, однако FindWindow не будет искать дочерние окна.

, Для которого необходимо будет использовать FindWindowEx

7
ответ дан Rudi Visser 29 November 2019 в 05:32
поделиться

Можно найти что при вызове.Refresh (), что Вы получаете новое окно верхнего уровня.

2
ответ дан GregUzelac 29 November 2019 в 05:32
поделиться

Из того, что я понимаю MainWindowHandle свойство процесса, который Вы запускаете, не допустимо. Если это так, можно использовать FindWindow функция (от SDK Win32), который возвращается, окно обрабатывают Вас потребность. Все, в чем Вы нуждаетесь, является именем класса главного окна целевого приложения. Можно получить его с помощью Шпиона ++ или Winspector. Также необходимо удостовериться, чтобы у Вас было правильное окно путем проверки что идентификатор процесса окна с помощью GetWindowThreadProcessId .

Наконец, я должен сказать, что я не эксперт по Win32 и могло бы быть лучшее решение для Вашего случая.

1
ответ дан blackwing 29 November 2019 в 05:32
поделиться

Используйте Процесс. GetProcessById (proc. Идентификатор); где proc был Вашим экраном-заставкой. Работы для меня.

Теперь, как пройти свойства главного окна в Системе. Windows. Формы для предоставления его фокусируют w/o, использующий win32? После того, как весь .net, как предполагается, является универсальным решением - он нет?

1
ответ дан 29 November 2019 в 05:32
поделиться

Если Вы знаете заголовок окна, можно использовать вызов Win32, FindWindow, через P/Invoke.

можно найти подпись здесь на pinvoke.net

1
ответ дан ageektrapped 29 November 2019 в 05:32
поделиться

Где-нибудь в коде, "реальное" главное окно создается. Можно просто сохранить дескриптор окна в то время и затем после завершений экрана-заставки, можно установить Приложение. MainWindow к реальному окну.

0
ответ дан Marcus Erickson 29 November 2019 в 05:32
поделиться

Свойство MainWindowHandle кэшируется после того, как к нему сначала получают доступ, который является, почему Вы не видите, что он изменяется даже после того, как дескриптор становится недопустимым. Информация GregUzelac корректна. Вызов Proces. Обновление будет заставлять следующий вызов Обрабатывать. MainWindowHandle для восстанавливания логики для нахождения нового дескриптора главного окна. Логика Michael также работает, потому что новый Процесс не имеет кэшированной версии MainWindowHandle.

0
ответ дан Matt Ellis 29 November 2019 в 05:32
поделиться