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

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

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

8
задан Einar Egilsson 31 May 2010 в 13:47
поделиться

4 ответа

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

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

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

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

.
0
ответ дан 6 December 2019 в 00:05
поделиться

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

3
ответ дан 6 December 2019 в 00:05
поделиться

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

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

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

0
ответ дан 6 December 2019 в 00:05
поделиться

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

1
ответ дан 6 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: