Как узнать дескриптор окна windows

http://www.cnblogs.com/zjutlitao/p/3889900.html

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

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

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


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

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

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

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

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

#include <Windows.h>  
#include <stdio.h>  
#include <string.h>  
#include <iostream>
using namespace std;


int main(int argc, char* argv[])
{
	// Получение дескриптора окна Kuwo Music в соответствии с именем класса окна  
	//HWND hq = FindWindow("kwmusicmaindlg", NULL);
	 // WeChat
	HWND hq = FindWindow("WeChatMainWndForPC", NULL);
	//qq
	//HWND hq = FindWindow("TXGuiFoundation", NULL);
	 // Получаем размер крутого музыкального окна  
	RECT rect;
	GetWindowRect(hq, &rect);
	int w = rect.right - rect.left, h = rect.bottom - rect.top;
	 cout << "wide:" << w << "" << "high:" << h << endl;


	 // Горизонтальные и вертикальные координаты положения мобильного окна - 100 позиций  
	MoveWindow(hq, 100, 100, w, h, false);


	 // Получаем окно рабочего стола  
	HWND hd = GetDesktopWindow();
	GetWindowRect(hd, &rect);
	w = rect.right - rect.left;
	h = rect.bottom - rect.top;
	 cout << "Ширина:" << w << "" << "Высокая:" << h << endl;


	return 0;
}

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

3. Используйте функции GetDesktopWindow и GetNextWindow, чтобы получить все дочерние окна.

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

  1. #include <Windows.h>  
  2. #include <stdio.h>  
  3. #include <tchar.h>  
  4. #include <string.h>  
  5. #include <iostream.h>  
  6.   
  7. int main()  
  8. {      
  9.     HWND hd=GetDesktopWindow();        // Получаем окно рабочего стола  
  10.     hd=GetWindow(hd,GW_CHILD);        // Получаем первое дочернее окно на экране  
  11.     char s[200]={0};  
  12.     int num=1;  
  13.     while(hd!=NULL)                    // Цикл для получения всех дочерних окон  
  14.     {  
  15.         memset(s,0,200);  
  16.         GetWindowText(hd,s,200);  
  17.         cout<<num++<<«: «<<s<<endl;  
  18.         hd=GetNextWindow(hd,GW_HWNDNEXT);  
  19.     }  
  20.     getchar();  
  21.     return 0;  
  22. }  

In light of a recent discussion on Meta complaining that questions like this one have «not been properly answered», I’m going to try and give answering this one a whirl. Not to imply that I think meklarian’s answer is bad—in fact, far from it. But it’s clearly been deemed unsatisfactory, so perhaps I can fill in some of the additional details.

Your problem results from a fairly widespread confusion over what the desktop window actually is. The GetDesktopWindow function does precisely what it’s documented to do: it returns a handle to the desktop window. This, however, is not the same window that contains the desktop icons. That’s a completely different window that appeared for the first time in Windows 95. It’s actually a ListView control set to the «Large Icons» view, with the actual desktop window as its parent.

Raymond Chen, a developer on the Windows Shell team provides some additional detail in the following Windows Confidential article: Leftovers from Windows 3.0

[ . . . ]  While in Windows 3.0, icons on the desktop represented minimized windows, in Windows 95, the desktop acted as an icon container.

The Windows 95 desktop was actually a window created by Explorer that covered your screen (but sat beneath all the other windows on your desktop). That was the window that displayed your icons. There was still a window manager desktop window beneath that (the window you get if you call Get­Desktop­Window), but you never saw it because it was covered by the Windows 95 desktop—the same way that the wood paneling in the basement of my colleague’s house covered the original wall and the time capsule behind the wall.

[ . . . ]

This desktop design has remained largely unchanged since its introduction in Windows 95. On a typical machine, the original desktop is still there, but it’s completely covered by the Explorer desktop.

In summary, then, the window returned by the GetDesktopWindow function is the actual desktop window, the only one we had way back in Windows 3.0. The Explorer desktop (the one that contains all your icons) is merely another window sitting on top of the desktop window (although one that completely covers the original) that wasn’t added until Windows 95.

If you want to get a handle to the Explorer desktop window, you need to do some additional work beyond simply calling the GetDesktopWindow function. In particular, you need to traverse the child windows of the actual desktop window to find the one that Explorer uses to display icons. Do this by calling the FindWindowEx function to get each window in the hierarchy until you get to the one that you want. It has a class name of SysListView32. You’ll also probably want to use the GetShellWindow function, which returns a handle to the Shell’s desktop window, to help get you started.

The code might look like this (warning: this code is untested, and I don’t recommend using it anyway!):

HWND hShellWnd = GetShellWindow();
HWND hDefView = FindWindowEx(hShellWnd, NULL, _T("SHELLDLL_DefView"), NULL);
HWND folderView = FindWindowEx(hDefView, NULL, _T("SysListView32"), NULL);
return folderView;

I noted there that I don’t actually recommend using that code. Why not? Because in almost every case that you want to get a handle to the desktop window (either the actual desktop window, or the Explorer desktop), you’re doing something wrong.

This isn’t how you’re supposed to interact with the desktop window. In fact, you’re not really supposed to interact with it at all! Remember how you learned when you were a child that you’re not supposed to play with things that belong to other people without their permission? Well, the desktop belongs to Windows (more specifically, to the Shell), and it hasn’t given you permission to play with its toys! And like any good child, the Shell is subject to throwing a fit when you try to play with its toys without asking.

The same Raymond Chen has published another article on his blog that details a very specific case, entitled What’s so special about the desktop window?

Beyond the example he gives, this is fundamentally not the way to do UI automation. It’s simply too fragile, too problematic, and too subject to breaking on future versions of Windows. Instead, define what it is that you’re actually trying to accomplish, and then search for the function that enables you to do that.

If such a function does not exist, the lesson to be learned is not that Microsoft simply wants to make life harder for developers. But rather that you aren’t supposed to be doing that in the first place.

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

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

HWND FindWindow(const char *lpClassName, const char *lpWindowName);

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

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

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

HWND H = FindWindow("TForm1", "Приложение 2");

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

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

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

HWND H = FindWindow("SciCalc", "Калькулятор");

Табаков Юрий

Табаков Юрий

Программист

Автор и редактор проекта CuBook.PRO. Главная задача, которую я ставлю перед собой – донести до начинающих программистов удобочитаемый материал. Буду рад выслушать замечания и предложения. Не забываем ставить оценки и делать репосты =)

  • Remove From My Forums
  • Общие обсуждения

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

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

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

    Control.Handle .

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

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

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

    Ниже приведен импорт этих WinAPI функций, используя P/Invoke:

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    
    

    Пример поиска дескриптора окна:

    IntPtr toplevelWindow = FindWindow(“classname”, ”windowcaption”);
    IntPtr childWindow = FindWindowEx(toplevelWindow, new IntPtr(0), “classname”, “windowcaption”);
    
    

    Для связи [mail]

Получение дескриптора окна (HWND)

В этом разделе показано, как в классическом приложении получить маркер окна для окна. область охватывает Windows библиотека пользовательского интерфейса (винуи) 3, Windows Presentation Foundation (WPF)и Windows Forms (WinForms) ; примеры кода представлены в C# и C++/WinRT.

Перечисленные выше платформы разработки и пользовательского интерфейса (в фоновом режиме) основаны на API-интерфейсе Win32. В Win32 объект окна определяется по значению, называемому маркером окна. И тип дескриптора окна — это HWND (хотя он отображается в C# как IntPtr). В любом случае вы услышите термин HWND , используемый в качестве краткой формы для дескриптора окна.

Существует несколько причин для получения HWND для окна в классическом приложении винуи 3, WPF или WinForms. одним из примеров является использование HWND для взаимодействия с определенными объектами среда выполнения Windows (WinRT), которые зависят от CoreWindow для вывода пользовательского интерфейса. Дополнительные сведения см. в разделе Отображение объектов пользовательского интерфейса WinRT, зависящих от CoreWindow.

Винуи 3 с C #

В приведенном ниже коде C# показано, как получить дескриптор окна (HWND) для объекта окна винуи 3. В этом примере вызывается метод жетвиндовхандле для класса взаимодействия C# для WinRT. виндовнативе . Дополнительные сведения о классах взаимодействия C# см. в разделе вызов интерфейсов COM-взаимодействия WinRT из приложения .NET 5 +.

Винуи 3 с C++

В приведенном ниже коде C++/WinRT показано, как получить дескриптор окна (HWND) для объекта Window винуи 3. В этом примере вызывается метод ивиндовнативе:: get_WindowHandle .

WPF с C #

В приведенном ниже коде C# показано, как получить дескриптор окна (HWND) для объекта окна WPF. В этом примере используется класс WindowInteropHelper .

WinForms с C #

В приведенном ниже коде C# показано, как получить дескриптор окна (HWND) для объекта формы WinForms. В этом примере используется свойство NativeWindow. Handle .

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

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

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

Функция IsWindow определяет, правильно ли идентифицирует дескриптор окна существующее окно. Имеются специальные константы, которые могут заменять дескриптор окна в некоторых функциях. Например, приложение может использовать HWND_BROADCAST в функциях SendMessage и SendMessageTimeout или HWND_DESKTOP в функции MapWindowPoints .

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

После создания окна, создающая функция возвращает дескриптор окна (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»

  • Как узнать дату установки windows 10
  • Как узнать дату создания файла windows
  • Как узнать дату смены пароля windows
  • Как узнать данные о жестком диске windows
  • Как узнать дату обновления windows 10