2010-05-31 4 views
7

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

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

ответ

0

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

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

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

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

окно
+1

Спасибо, что сделал трюк.Хотя быть понятным «EnumChildWindows recursivly», вы на самом деле просто вызываете его один раз с помощью дескриптора окна верхнего уровня, сама функция EnumChildWindows выполняет рекурсию. –

2

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

+0

Я просто заметил в 'findwindow' тег вашего вопроса - хорошо Угадай. :) – MusiGenesis

+0

FindWindow находит только окна верхнего уровня, FindWindowEx - это то, что вы на самом деле имеете в виду, НО безопаснее вызвать функцию Enum, чтобы вы не пропустили никаких окон. – Anders

+0

@Anders: уже добавлена ​​ссылка FindWindowEx. В большинстве случаев FindWindow возвращает нужное окно. Самый безопасный подход состоит в том, чтобы не гасить вокруг с именами классов Windows в первую очередь. – MusiGenesis

0

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

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

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

+0

Хорошо. Но в этом конкретном случае я знаю, что только одно активное окно за один раз с этим конкретным классом окон, так что это не проблема. Вероятно, я должен был сказать, что в вопросе :) –

1

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

+1

WindowFromPoint здесь не применяется, если вы не предлагаете, чтобы пользователь указывал курсор на это окно в определенное время или событие! – Anders

+1

@Anders, VsTipWindow - это своего рода ToolTipWindow. Окна Tooltipwindows имеют природу, чтобы быть видимой, когда мышь находится над другим окном и исчезает, когда мышь покидает окно. но тем не менее WindowFromPoint не имеет ничего общего с самой точкой мыши. он предоставляет дескриптор окна для каждой произвольной точки. Если это применимо здесь или нет, это не вопрос, пожалуйста, прочтите мои первые 3 слова. Я просто хочу дать еще одну идею на всякий случай, если первая идея Эйнара не сработает. мы даже не знаем, что он собирается сделать – OlimilOops

Смежные вопросы