Обработка неверного дескриптора окна - PullRequest
2 голосов
/ 02 августа 2010

Приложение извлекает дескрипторы окна, используя процедуры Enum *.

Бывает, что в то время как приложение управляет дескриптором (получить имя класса, статистику окна ...) перечисленного / созданного окна, дескриптор больше не действителен. Дескрипторы окна управления кодом защищены с помощью блока try / catch, но дескриптор окна сохраняется и последовательно используется для управления представленным окном.

Как справиться с временем жизни дескриптора окна? Можно ли обнаружить недействительность ручки?

Я бы хотел избегать блоков try / catch каждый раз, когда приложение использует дескрипторы окон.

Ответы [ 4 ]

2 голосов
/ 03 августа 2010

У меня уже есть реальное решение ... но я не знал об этом до сих пор!

Спасибо всем за разъяснения о времени жизни дескриптора окна, но на самом деле есть метод для обнаруженияо времени жизни дескриптора окна: CbtProc .

В случае, если хук установлен во всей системе, можно уведомить конкретные приложения (все зависит от реальной реализации хука CBT) об окнеdestroy, который указывает, что определенный дескриптор не будет действительным после уведомления.

Из документации:

HCBT_DESTROYWND Указывает дескриптор окна, которое должно быть уничтожено.

Конечно, доступ к дескрипторам, использующим подпрограммы WINAPI, должен быть синхронизирован с системой уведомлений, что, по-видимому, не дает хорошей осуществимости (ловушка CBT фактически блокирует уничтожение окна, поскольку синхронизируется с логикой приложения).

2 голосов
/ 02 августа 2010

Оконные дескрипторы безопасны только при использовании из потока, который создал окно. Из любого другого потока все, что вы можете знать о дескрипторе окна, это то, что он действовал когда-то в прошлом. Прямо сейчас, это может или не может быть, и если это так, это может относиться к другому окну, чем предполагалось полностью.

1 голос
/ 02 августа 2010

Вы можете передать его на IsWindow() для подтверждения.
Есть несколько предостережений, однако оба будут применяться практически к любому подходу к этому:

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

Если вы делаете это с окном в одном из ваших внешних приложений, вы можете добавить 2-й уровень проверки с помощью Set / GetProp () с уникальным идентификатором некоторого вида.

0 голосов
/ 02 августа 2010

Вы можете использовать функцию GetWindowInfo.Возвращает 0, если дескриптор недействителен.

...