Получить дескриптор окна из имени класса окна - PullRequest
8 голосов
/ 31 мая 2010

Я пытаюсь получить дескриптор окна для дочернего окна в моем процессе, и единственная информация, которую я имею, это имя класса окна.Есть ли какие-нибудь функции win32, которые я могу использовать для этого?Я делаю это из C #.

Немного подробнее: это плагин для Visual Studio, написанный на C #.Так что мой процесс - это визуальная студия, в которой много окон.Один из них имеет класс окна "VsTipWindow".Я не знаю непосредственное родительское окно этого окна, все, что у меня есть, это имя класса.Есть ли способ для меня, чтобы получить ручку окна только от этого?

Ответы [ 4 ]

3 голосов
/ 31 мая 2010

FindWindow - это вызов Win32, который вы хотите для этого (или FindWindowEx , если существует более одного окна с этим конкретным именем класса, и FindWindow не возвращает то, что вы ищу).

1 голос
/ 31 мая 2010

просто дополнительная информация ..
может быть полезно знать, что вы можете получить дескриптор окна из точки
WindowFromPoint
http://msdn.microsoft.com/en-us/library/ms633558(VS.85).aspx

0 голосов
/ 31 мая 2010

Класс окна Win32 является общей реализацией элемента управления, дескриптор окна является экземпляром элемента управления.Таким образом, у вас будет несколько оконных дескрипторов с одним и тем же классом окна (например, EDIT).Строго говоря, класс окна является указателем на оконную процедуру.

Фреймворки, такие как .net (и даже MFC), как правило, совместно используют несколько оконных классов для всех элементов управления окнами, и затем они будут отправлены в соответствующие элементы управления.(т.е. они имеют единую общую оконную процедуру).То же самое относится и к большим приложениям, таким как Visual Studio или Office.

Так что очень трудно обнаружить определенные окна только через их класс окна.Однако вы можете перечислить все окна, которые имеют определенный класс окон, с помощью FindWindow, вы также получите текст окна, который может вам помочь.Используя GetWindowThreadProcessId, вы можете определить, принадлежит ли окно к Visual Studio.

0 голосов
/ 31 мая 2010

Прежде всего следует отметить, что между окнами и классами окон нет отношения 1: 1, более одного окна могут использовать один и тот же класс.

Я полагаю, что ваш единственный вариант - вызывать EnumChildWindows рекурсивно, начиная с окна Visual Studio верхнего уровня (или какого-то другого окна выше в иерархии окон, если вы знаете одно, которое является прародителем окна VsTipWindow) Вы бы вызывали GetClassName и сравнивали строку с VsTipWindow, пока не найдете окно.

Поскольку вы говорили о неизвестном родителе, я предполагаю, что вы находитесь за дочерним окном, но если это окно верхнего уровня, вам нужно использовать EnumWindows (и вам, вероятно, следует использовать GetWindowThreadProcessId, чтобы убедиться, что вы получаете правильный процесс также после того, как вы найдете окно с этим именем класса)

(я уверен. В .NET есть функции, которые делают то же самое, что и нативный API, или вам придется выполнить PInvoke)

...