Совет 1: Как получить дескриптор окна

Концепция пользовательского интерфейса в ОС 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.85%29.aspx и http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680%28v=vs.85%29.aspx .При использовании классов различных фреймворков создание объектов окон операционной системы может происходить как явно (посредством вызова метода), так и неявно (реализация стратегии RAII). Поэтому дескриптор окна лучше получать на готовом инициализированном объекте. О методах классов, возвращающих дескриптор окна, инкапсулируемый объектом, можно узнать в документации соответствующего фреймворка. Например, в MFC подобным методом является GetSafeHwnd класса CWnd.
2
Получите дескриптор окна путем его поиска. Используйте API-функции FindWindow и FindWindowEx или соответствующие методы-обертки объектов классов применяемого фреймворка.Функция FindWindow возвращает дескриптор окна верхнего уровня, если оно найдено или NULL при неудаче. Поиск производится по имени класса и заголовку окна. Описание параметров и аспектов работы функции находится по ссылке http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499%28v=vs.85%29.aspx .Семантика работы функции FindWindowEx аналогична FindWindow с той лишь разницей, что она производит поиск дочерних окон. Документация для FindWindowEx приведена по ссылке http://msdn.microsoft.com/en-us/library/windows/desktop/ms633500%28v=vs.85%29.aspx .
3
Найдите дескриптор окна в процессе перечисления их множеств. Воспользуйтесь API-функциями EnumWindows, EnumChildWindows, EnumThreadWindows либо методами объектов классов используемого фреймворка.Функции EnumWindows и EnumChildWindows перечисляют окна верхнего уровня и дочерние окна соответственно. Функция EnumThreadWindows перечисляет все не дочерние окна указанного потока. Каждой из этих функций должен быть передан указатель на процедуру обратного вызова, которой в процессе работы будут передаваться дескрипторы найденных окон в качестве параметров.Комбинируя функции перечисления, получая и анализируя свойства окон в процедуре обратного вызова, можно найти дескриптор требуемого окна. Документация для описанных функций приведена по ссылкам:- EnumWindows: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497%28v=vs.85%29.aspx ;- EnumChildWindows: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633494%28v=vs.85%29.aspx ;- EnumThreadWindows: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633495%28v=vs.85%29.aspx .
4
Получите дескриптор окна по известным координатам. Функции WindowFromPoint, ChildWindowFromPoint, ChildWindowFromPointEx возвращают дескрипторы окон, к областям расположения которых принадлежит заданная точка.Функция WindowFromPoint наиболее проста в использовании, но не возвращает дескрипторы скрытых и отключенных окон. Документация по ее применению находится по ссылке http://msdn.microsoft.com/en-us/library/windows/desktop/ms633558%28v=vs.85%29.aspx .Функции ChildWindowFromPoint и ChildWindowFromPointEx находят дескрипторы дочерних окон заданного родительского окна, принадлежащих заданной точке. При этом поведением ChildWindowFromPointEx можно гибко управлять с помощью дополнительного параметра. Документация для данных функций приводится по ссылкам:- ChildWindowFromPoint: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632676%28v=vs.85%29.aspx ;- ChildWindowFromPointEx: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632677%28v=vs.85%29.aspx .
Видео по теме

Совет 2 : Как получить дескриптор

Интерфейс прикладного программирования операционных систем семейства Windows представлен набором функций. При их вызовах могут создаваться различные объекты (файлы, процессы, потоки, объекты синхронизации, и т.д.). Для обеспечения достаточно абстрактного и унифицированного доступа к этим объектам их идентификация производится при помощи дескрипторов - «обезличенных» числовых значений.
Как получить дескриптор
Вам понадобится
  • - транслятор с языка программирования, допускающего использование Windows API;
  • - возможно, Windows Platform SDK.
Инструкция
1
Получите дескрипторы окон. Это можно сделать очень многими путями. Конкретный способ зависит от конечной цели.

Используйте API-функции CreateWindow или CreateWindowEx для создания окна. Они возвращают дескриптор в случае успеха и NULL в случае неудачи.

Произведите поиск окон верхнего уровня и дочерних окон по различным параметрам с использованием функций FindWindow и FindWindowEx соответственно. При успешном поиске будет получен дескриптор окна.

Перечисляйте окна функциями EnumWindows, EnumChildWindows, EnumThreadWindows. Дескрипторы найденных окон будут передаваться в качестве параметра функции обратного вызова.

Найдите дескриптор окна, расположенного в определенной позиции на экране. Произведите вызов одной из функций: WindowFromPoint, ChildWindowFromPoint или ChildWindowFromPointEx.
2
Получите дескрипторы процессов. Создайте новый процесс при помощи вызова API-функций CreateProcess, CreateProcessAsUser, CreateProcessWithTokenW или CreateProcessWithLogonW. Все они возвращают дескриптор нового процесса в поле hProcess структуры типа PROCESS_INFORMATION, указатель на которую должен передаваться им последним параметром.

Найдите дескриптор процесса по его известному идентификатору. Используйте вызов OpenProcess. Идентификаторы всех запущенных процессов могут быть получены, например, при помощи функций CreateToolhelp32Snapshot, Process32First и Process32Next библиотеки Tool Help.

Извлеките псевдо-дескриптор текущего процесса, используя функцию GetCurrentProcess.
3
Получите дескрипторы потоков. Функции CreateThread и CreateRemoteThread создают потоки в своем и чужом процессе, соответственно, возвращая их дескрипторы. Открыть существующий поток с использованием его идентификатора, получив соответствующий дескриптор, можно при помощи функции OpenThread. Псевдо-дескриптор текущего подтока возвращается при вызове GetCurrentThread.
4
Дескрипторы файлов, директорий, физических дисков, томов на дисках, консолей, коммуникационных ресурсов (портов ввода-вывода), почтовых слотов и именованных каналов могут быть получены при помощи вызова единственной функции - CreateFile.
5
Дескрипторы объектов отображения файлов на память возвращаются при вызовах CreateFileMapping и OpenFileMapping.
6
Функции CreateMutex, CreateSemaphore и CreateEvent создают, а функции OpenMutex, OpenSemaphore и OpenEvent открывают существующие объекты синхронизации (мьютексы, семафоры и события). Все они возвращают дескрипторы.
7
Манипуляции всеми объектами GDI (такими как контексты устройств, шрифты, кисти, карандаши, аппаратно зависимые и независимые растры, DIB-секции, и т.д.) производятся посредством их дескрипторов. Функции для создания объектов GDI многочисленны и за получением информации о них стоит обратиться к соответствующему разделу MSDN.
8
Дескриптор, полученный в одном процессе, как правило, не может использоваться в другом. Однако в ряде случаев возможно получение дескриптора-дубликата, соответствующего первичному объекту. Произведите вызов API-функции DuplicateHandle для осуществления дублирования дескриптора. Это может быть применено, например, для реализации совместного использования неименованных объектов синхронизации или каналов несколькими процессами.
Видео по теме
Источники:
  • Windows Development в 2019
Совет полезен?
Поиск
Добавить комментарий к статье
Осталось символов: 500