Як отримати дескриптор вікна

Як отримати дескриптор вікна

Концепція інтерфейсу користувача в ОС Windows побудована на понятті вікна. Діалоги, кнопки, панелі управління, списки — все це вікна. Тому для того щоб зробити будь-які дії з яким або елементом інтерфейсу свого або чужого програми, потрібно отримати дескриптор вікна.

Вам знадобиться

- Пакет Platform SDK;
- Компілятор.

Інструкція

  1. Отримайте дескриптор вікна, створивши його. Проведіть виклики API-функцій CreateWindow або CreateWindowEx, або викличте відповідні методи-обгортки (на необхідних об’єктах) класів використовуваного фреймворку або бібліотеки, інкапсулюють функціонал роботи з вікнами або елементами управління.

    Опції CreateWindow і CreateWindowEx безпосередньо повертають дескриптор вікна при успішному його створенні. При невдалому виклику вони повертають значення NULL. Код причини помилки може бути запитаний за допомогою API-функції GetLastError. Прототипи й докладний опис параметрів функцій CreateWindow і CreateWindowEx можна отримати за посиланнями http://msdn.microsoft.com/en-us/library/windows/desktop/ms632679% 28v = vs …. і http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680% 28v = vs …. .

    При використанні класів різних фреймворків створення об’єктів вікон операційної системи може відбуватися як явно (за допомогою виклику методу), так і неявно (реалізація стратегії RAII). Тому дескриптор вікна краще отримувати на готовому ініціалізувати об’єкт. Про методи класів, які повертають дескриптор вікна, інкапсуліруемий об’єктом, можна дізнатися в документації відповідного фреймворка. Наприклад, в MFC подібним методом є GetSafeHwnd класу CWnd.
  2. Отримайте дескриптор вікна шляхом його пошуку. Використовуйте API-функції FindWindow і FindWindowEx або відповідні методи-обгортки об’єктів класів застосовуваного фреймворка.

    Функція FindWindow повертає дескриптор вікна верхнього рівня, якщо воно знайдено або NULL при невдачі. Пошук здійснюється по імені класу і заголовку вікна. Опис параметрів і аспектів роботи функції знаходиться за посиланням http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499% 28v = vs …. .

    Семантика роботи функції FindWindowEx аналогічна FindWindow з тією лише різницею, що вона робить пошук дочірніх вікон. Документація для FindWindowEx наведена за посиланням http://msdn.microsoft.com/en-us/library/windows/desktop/ms633500% 28v = vs …. .
  3. Знайдіть дескриптор вікна в процесі перерахування їх множин. Скористайтеся API-функціями EnumWindows, EnumChildWindows, EnumThreadWindows або методами об’єктів класів використовуваного фреймворка.

    Опції EnumWindows і EnumChildWindows перераховують вікна верхнього рівня та дочірні вікна відповідно. Функція EnumThreadWindows перераховує все не дочірні вікна зазначеного потоку. Кожній з цих функцій має бути переданий покажчик на процедуру зворотного виклику, якої в процесі роботи будуть передаватися дескриптори знайдених вікон в якості параметрів.

    Комбінуючи функції перерахування, отримуючи та аналізуючи властивості вікон у процедурі зворотного дзвінка, можна знайти дескриптор потрібного вікна. Документація для описаних функцій наведена за посиланнями:

    - EnumWindows: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497% 28v = vs …. ;

    - EnumChildWindows: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633494% 28v = vs …. ;

    - EnumThreadWindows: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633495% 28v = vs …. .
  4. Отримайте дескриптор вікна з відомих координатах. Опції WindowFromPoint, ChildWindowFromPoint, ChildWindowFromPointEx повертають дескриптори вікон, до областей розташування яких належить задана точка.

    Функція WindowFromPoint найбільш проста у використанні, але не повертає дескриптори прихованих і неактивні вікон. Документація по її застосуванню знаходиться за посиланням http://msdn.microsoft.com/en-us/library/windows/desktop/ms633558% 28v = vs …. .

    Опції ChildWindowFromPoint і ChildWindowFromPointEx знаходять дескриптори дочірніх вікон заданого батьківського вікна, що належать заданій точці. При цьому поведінкою ChildWindowFromPointEx можна гнучко управляти за допомогою додаткового параметра. Документація для даних функцій наводиться за посиланнями:

    - ChildWindowFromPoint: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632676% 28v = vs …. ;

    - ChildWindowFromPointEx: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632677% 28v = vs …. .