Проверьте HWND использование API Win32

От собственного API Win32 с помощью C++ там способ определить, допустимо ли окно, связанное с HWND все еще?

18
задан Brian R. Bondy 26 February 2010 в 19:31
поделиться

3 ответа

Вы можете использовать Win32 API IsWindow .

Не рекомендуется использовать его по 2 причинам:

  1. Дескрипторы Windows можно повторно использовать после того, как окно будет уничтожено, поэтому вы не знаете, есть ли у вас дескриптор совершенно другого окна. или нет.
  2. Состояние может измениться сразу после этого вызова, и вы подумаете, что оно действительное, но на самом деле оно может быть недействительным.

Из MSDN (та же ссылка, что и выше):

Поток не должен использовать IsWindow для окна , которое он не создавал, потому что окно может быть уничтожено после {{1} } эта функция была вызвана. Кроме того, поскольку дескрипторы окон повторно используются дескриптор может даже указывать на другое окно.

Что можно сделать?

Возможно, вашу проблему можно изменить так, чтобы у вас не было необходимости проверять действительный дескриптор. Например, вы можете установить канал от клиента к серверу.

Вы также можете создать ловушку Windows для определения появления определенных сообщений, но это, вероятно, излишне для большинства нужд.

32
ответ дан 30 November 2019 в 06:11
поделиться

Вы можете использовать IsWindow () или также попытаться отправить окну сообщение WM_NULL с помощью SendMessage (hWnd, WM_NULL) и посмотреть, успешно ли оно.

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

Единственное известное мне решение - создать системный хук , который ищет сообщения, указывающие на то, что окно уничтожено (WM_CLOSE, WM_DESTROY). Затем вы сравните дескриптор окна сообщения с тем, что вы держите, чтобы увидеть, не затронуты ли какие-либо из интересующих вас окон. См. Здесь для получения дополнительной информации о обработчиках в масштабе всей системы.

8
ответ дан 30 November 2019 в 06:11
поделиться
1
ответ дан 30 November 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: