Как получить дескриптор окна
Перейти к содержимому

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

  • автор:

Русские Блоги

[WinAPI] Несколько методов получения дескриптора окна

1. Используйте функцию FindWindow, чтобы получить дескриптор окна.

Пример: Используйте функцию FindWindow, чтобы получить дескриптор окна, затем получить размер окна и переместить окно в указанное положение.

Мы хотим взять оконную ручку крутой музыкальной шкатулки и переместить ее, что нам делать?

[WinAPI] Несколько методов получения дескриптора окна

Сначала откройте SPY ++ в инструменте в VC или VS и щелкните окно поиска следующим образом:

PS: Переместите похожую на яблочко вещь в окно, которое вы хотите найти. Это Kuwo Music Box. Информация об окне появится ниже, включая дескриптор, имя, класс, тип, размер и расположение окна. Нажмите ОК, и появится дополнительная информация

PS: Поскольку FindWindowA (LPCSTR lpClassName, LPCSTR lpWindowName); может найти дескриптор окна по имени класса окна и имени окна, если вы знаете только одно, напишите другое как null. Здесь мы обнаружим, что его имя окна будет следовать за воспроизводимой песней Поэтому неразумно находить дескриптор окна по имени окна (но мы можем получить имя воспроизводимой в данный момент музыки по имени окна!), Поэтому мы используем имя класса окна, чтобы получить дескриптор окна.

Ха-ха, остальные две функции очень просты, и я должен это понять.

>_<: Здесь функция GetWindowRect может получить прямоугольник окна, и размер окна может быть рассчитан в соответствии с прямоугольником окна; MoveWindow может перемещать окно в указанную позицию, а 4-й и 5-й параметры также могут изменять размер окна!

>_<: Ниже я добавил дополнительную операцию, чтобы получить размер рабочего стола

2、 Получить все окна верхнего уровня и их дочерние окна

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

нота: Некоторые окна были специально обработаны, например, QQ нельзя получить этим методом!

>_<: Как показано выше, у некоторых окон нет имен, поэтому они пусты

  1. #include <Windows.h>
  2. #include <stdio.h>
  3. #include <tchar.h>
  4. #include <string.h>
  5. #include <iostream.h>
  6. int Pnum=0,Cnum; // Количество родительских окон, количество дочерних окон каждого родительского окна
  7. //———————————————————
  8. // Функция обратного вызова EnumChildWindows, hwnd — это указанное родительское окно
  9. //———————————————————
  10. BOOL CALLBACK EnumChildWindowsProc( HWND hWnd, LPARAM lParam)
  11. <
  12. char WindowTitle[100]=<0>;
  13. Cnum++;
  14. ::GetWindowText(hWnd,WindowTitle,100);
  15. printf( "—|%d :%s\n" ,Cnum,WindowTitle);
  16. return true ;
  17. >
  18. //———————————————————
  19. // Функция обратного вызова EnumWindows, hwnd — найденное окно верхнего уровня
  20. //———————————————————
  21. BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam)
  22. <
  23. if (GetParent(hWnd)==NULL && IsWindowVisible(hWnd)) // Определяем, видно ли окно верхнего уровня и
  24. <
  25. Pnum++;
  26. Cnum=0;
  27. char WindowTitle[100]=<0>;
  28. ::GetWindowText(hWnd,WindowTitle,100);
  29. printf( "——————————————-\n" );
  30. printf( "%d: %s\n" ,Pnum,WindowTitle);
  31. EnumChildWindows(hWnd,EnumChildWindowsProc,NULL); // Получаем все дочерние окна родительского окна
  32. >
  33. return true ;
  34. >
  35. //———————————————————
  36. //основная функция
  37. //———————————————————
  38. int main()
  39. <
  40. // Получить все окна верхнего уровня на экране и вызвать функцию обратного вызова каждый раз, когда будет найдено окно
  41. EnumWindows(EnumWindowsProc ,NULL );
  42. getchar();
  43. return 0;
  44. >

PS: Пройдя таким образом, вы можете найти нужный дескриптор окна (не делайте плохих вещей! Ха-ха

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

После создания окна, создающая функция возвращает дескриптор окна (window handle), который уникально идентифицирует окно. Прикладная программа использует этот дескриптор в других функциях, чтобы направить их действия на это окно. Дескриптор окна имеет тип данных HWND; прикладная программа должна использовать этот тип при объявлении переменной, которая содержит в себе дескриптор окна.

Win32 API включает в себя несколько специальных констант, которые могут заменять дескриптор окна в некоторых функциях. Например, прикладная программа может использовать HWND_TOPMOST в функции SendMessageTimeout, HWND_BROADCAST в функции SendMessage, или HWND_DESKTOP в функции MapWindowPoints.

Хотя константа ПУСТО (NULL) — не дескриптор окна, Вы можете использовать её в некоторых функциях, чтобы определить, нет ли воздействия на какое-либо окно. Например, установив значение ПУСТО (NULL) в параметре hwndParent функции CreateWindowEx, создается окно, у которого нет какого либо родителя или владельца. Некоторые функции могут возвращать значение ПУСТО (NULL) вместо дескриптора, указывая, что данное действие не применяется ни к какому окну.

Прикладная программа может использовать функцию FindWindow, чтобы обнаружить, существует ли в системе окно с определенным именем класса или именем окна. Если такое окно существует, FindWindow возвращает дескриптор окна. Чтобы ограничивать поиск в дочерних окнах отдельной прикладной программы, используйте функцию FindWindowEx. Функция IsWindow определяет, правильно ли идентифицирует дескриптор окна существующее окно.

Дополнительные материалы на сайте.

«Шаг 116 — Посылка сообщений между программи»
«N/A»
«N/A»
«N/A»
«N/A»
«N/A»

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

Gray Pipe

Спрашивающий

Общие обсуждения

Во многих сценариях windows-разработки требуется получить дескриптор окна (windows handle) для выполнения некоторых задач:

  1. Отправить сообщение окну
  2. Получить/изменить текст окна
  3. Изменение поведения
  4. и так далее

Если нужно в .net приложении получить дескриптор своего окна, то этого можно достичь с помощью свойства Control.Handle .

Если нужно получить дескриптор другого окна, то для этого нужно воспользоваться Windows API функциями FindWindow или FindWindowEx .

Функция FindWindow используется для получения дескриптора главного окна по имени класса и имени окна.

Функция FindWindowEx используется для поиска и получения дескриптора дочернего окна для заданного главного окна.

FindWindow – получение дескриптора окна

Запись была обновлена

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

Получить дескриптор окна можно функцией FindWindow, которая имеет вид:

Параметр IpClassName указывает на строку с нулевым конечным символом, содержащую имя класса. Параметр IpWindowName указывает на строку с нулевым конечным символом, содержащую имя окна (это свойство Caption формы, отображаемое в полосе заголовка окна). Если этот параметр равен NULL, то считается, что под критерий поиска подходит любое окно указанного класса.

Если поиск прошел успешно, то функция возвращает дескриптор окна, имеющего указанное имя класса и имя окна. В противном случае возвращается NULL.

Эту функцию легко использовать, если вы знаете имя класса искомого окна. Например, если ваше приложение вызвало другое приложение, созданное вами самими, то вы знаете имя класса формы этого другого приложения. Тогда вы можете, например, с помощью код определить дескриптор окна приложения, класс формы которого TForm1, а значение свойства Caption формы — «Приложение 2».

Если же приложение, которым вы хотите управлять, создано не вами, то текст полосы заголовка вы легко можете увидеть, выполнив его, а вот имя класса вам неизвестно. Пусть, например, вы запустили из своего приложения программу Windows «Калькулятор», чтобы пользователь смог что-то с его помощью посчитать. Как управлять в дальнейшем этим калькулятором, если требуется, например, его свернуть, закрыть и т.д.?

Одна из возможностей узнать имя класса какого-то приложения — воспользоваться поставляемой вместе с C++Builder программой WinSight 32 (файл . \ProgramFiles\Borland\CBuilder6\Bin\ws32.exe). Запустите интересующее вас приложение, затем запустите WinSight 32, выполните команду Spy | Find Window и вы увидите список всех окон, зарегистрированных в данный момент в Windows. Лучше, чтобы в этот момент у вас было бы открыто не очень много окон, чтобы проще было найти среди них нужное.

В списке, который вы увидите, для каждого окна будут указаны среди прочей информации имя класса в фигурных скобках «< >» и заголовок окна — последний элемент данных в строке каждого окна. Например, запустив «Калькулятор», вы можете с помощью WinSight 32 найти, что имя класса окна этого приложения — «SciCalc». Следовательно, определить в своем приложении дескриптор открытого приложения «Калькулятор» вы можете оператором:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *