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

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

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

4 ответов


во-первых, следует отметить, что между классами windows и window нет отношения 1 к 1, более одного окна может использовать один и тот же класс.

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

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

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


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


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


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

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

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