Поскольку ShowWindowAsync()
возвращает ноль, если окно было ранее скрыто согласно документации MSDN , а ноль интерпретируется как FALSE
.Возвращаемое значение не указывает, была ли функция успешной или нет.
Таким образом, при первом вызове ShowWindowAsync(mwh, SW_HIDE)
в видимом окне функция возвращает TRUE
, поскольку ShowWindowAsync()
возвращает ненулевое значение, указывающееокно (которое теперь / будет скрыто) раньше было видимым.
Тогда второй вызов ShowWindowAsync(mwh, SW_SHOW)
в скрытом окне возвращает FALSE
, потому что ShowWindowAsync()
возвращает нулевое значение, указывающее окно (то естьтеперь / будет видимым) раньше был скрыт.
Другими словами, это сделано по задумке, и функция должна работать как задумано (если только окно mwh
не отвечает на сообщения или не является недействительным).
Но настоящая проблема здесь в том, что когда вы прячете окно, свойство Process::MainWindowHandle
больше не имеет дескриптора .
У процесса есть главныйОкно связывается с ним только в том случае, если процесс имеет графический интерфейс.Если связанный процесс не имеет главного окна, значение MainWindowHandle равно нулю. Это значение также равно нулю для процессов, которые были скрыты, то есть процессов, которые не видны на панели задач. Это может быть в случае процессов, которые отображаются в виде значков в области уведомлений, в крайнем правом углу.панели задач.
Что вам нужно сделать, это получить дескриптор окна с помощью p(0).MainWindowHandle
один раз и сохранить возвращенный дескриптор где-нибудь, чтобы вы могли показать / скрыть окно.Конечно, вы должны убедиться, что вы обнулили сохраненный дескриптор, когда окно уничтожается целевым процессом.В случае Блокнота вы можете использовать событие Process::Exited
.