Совет 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: Как узнать дескриптор

Дескриптор окна, или Handle Window, - специфический идентификатор, который выдается операционной системой окну во время его создания. Если вы вам по каким-либо причинам нужно знать системный дескриптор какого-либо окна (например, при написании приложения), это можно сделать с помощью программы HWND.
Вам понадобится
  • - программа HWND.
Инструкция
1
Найдите данное приложение через поисковые системы в интернете и загрузите на компьютер. Данная программа является бесплатным приложением, разработкой программиста Лесникова Павла. Перед распаковкой архива с программой проверьте загруженные данные антивирусным программным обеспечением. Распакуйте архив с программой. Запустите утилиту, кликнув дважды по файлу WHD.exe. Окно программы имеет простой интерфейс: элементы управления и поле для вывода дескрипторов. Если у вас нет архиватора, загрузите из интернета программу, которая называется Win Rar.
2
Установите переключатель в позицию «Из окна под курсором» и нажмите CapsLock на клавиатуре. После этой операции в поле вывода дескрипторов будут автоматически появляться идентификаторы всех окон, над которыми проходит курсор мыши. Чтобы отключить данную процедуру, снова нажмите на CapsLock. Введите класс окна, чей дескриптор нужно узнать.
3
Нажмите на кнопку «ОК», и в поле внизу появится искомый идентификатор. Чтобы закрыть окно программы, нажмите на крестик в верхнем правом углу. Для связи с разработчиком программы зайдите на сайт http://vokinsel.dviger.com. Вы сможете там получить консультацию в режиме реального времени, а также узнать о наличии новых версий программного обеспечения.
4
Данная утилита не требует установки и очень проста в использовании. Полученные таким способом идентификаторы окон могут быть в дальнейшем использованы в других приложениях для обращения к окнам сервисных служб Windows и окнам запущенных программ. Если вы не знаете, как пользоваться подобными программами, читайте справку. Как правило, разработчики описывают основные принципы работы с программами.
Видео по теме

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

Интерфейс прикладного программирования операционных систем семейства 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
Видео по теме
Поиск
Совет полезен?
Добавить комментарий к статье
Осталось символов: 500