2010-08-02 4 views
2

Приложение извлекает окна с помощью Enum * подпрограмм.Обработка недействительного дескриптора окна

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

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

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

ответ

2

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

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

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

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

HCBT_DESTROYWND Определяет дескриптор окна, собирающегося быть уничтожены.

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

0

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

+0

-1 [IsWindow] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633528.aspx) - это функция, которую вы ищете. Кроме того, OP требует уведомления об уничтожении дескриптора, а не проверки дескриптора. – jnm2

1

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

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

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

2

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

Смежные вопросы