2010-05-31 9 views
7

Estoy tratando de obtener un identificador de ventana en una ventana secundaria en mi proceso y la única información que tengo es el nombre de clase de ventana. ¿Hay alguna función win32 que pueda usar para eso? Estoy haciendo esto desde C#.Obtener identificador de ventana de la ventana del nombre de la clase

Un poco más de detalle: Este es un plugin de Visual Studio, escrito en C#. Entonces mi proceso es Visual Studio, que tiene muchas ventanas. Uno de ellos tiene una clase de ventana "VsTipWindow". No conozco la ventana padre inmediata de esa ventana, todo lo que tengo es el nombre de la clase. ¿Hay alguna manera de obtener el identificador de ventana solo por eso?

Respuesta

0

En primer lugar hay que señalar que no existe una relación de 1 a 1 entre las ventanas y las clases de ventana, más de una ventana podría utilizar la misma clase.

Supongo que su única opción es llamar a EnumChildWindows recursivamente comenzando con la ventana de nivel superior de Visual Studio (u otra ventana más arriba en la jerarquía de la ventana si conoce una abuela de la ventana VsTipWindow) En la función de devolución de llamada EnumChildWindows llamarás a GetClassName y compararás la cadena con VsTipWindow hasta que encuentres la ventana.

Como hablaste de padres desconocidos, estoy asumiendo que buscas una ventana secundaria, pero si esta ventana es de nivel superior, debes usar EnumWindows (y probablemente deberías usar GetWindowThreadProcessId para asegurarte de que obtienes el también proceso correcto después de encontrar una ventana con ese nombre de clase)

(estoy seguro de .NET tiene funciones que hacen lo mismo que la API nativa, o que tendría que PInvoke)

ventana
+1

Gracias, eso funcionó.Aunque para que quede claro "EnumChildWindows recursivly", en realidad solo lo llama una vez con el controlador de ventana de nivel superior, la función EnumChildWindows sí mismo ya hace la recursión. –

2

FindWindow es la llamada Win32 que desea para esto (o FindWindowEx si hay más de una ventana con ese nombre de clase particular, y FindWindow no devuelve la que está buscando).

+0

acabo notó la etiqueta 'findwindow' de su pregunta - buena adivinar. :) – MusiGenesis

+0

FindWindow sólo encuentra ventanas de nivel superior, FindWindowEx es lo que realmente significa, pero es más seguro para llamar a la función de enumeración de modo que no se pierda ninguna ventana – Anders

+0

@Anders: ya se añade el enlace FindWindowEx. En la mayoría de los casos como este, FindWindow devuelve la ventana que desea. El enfoque más seguro de todo es no ensuciarnos con nombres de clase de Windows en primer lugar. – MusiGenesis

0

un Win32 clase es la implementación genérica de un control, el manejo de las ventanas es la instancia del control. Por lo tanto, tendrá varios identificadores de ventana con la misma clase de ventana (por ejemplo, EDITAR). Estrictamente hablando, una clase de ventana es el puntero al procedimiento de ventana.

Los marcos como .net (e incluso MFC) tienden a compartir pocas clases de ventana para todos los controles de ventanas y luego se envían a los controles apropiados (es decir, tienen un único procedimiento de ventana genérico). Esto es lo mismo también para grandes aplicaciones como Visual Studio u Office.

Así que este renders muy difíciles de detectar a ventanas específicas sólo a través de su clase de ventana. Sin embargo, puede enumerar todas las ventanas que tienen una clase de Windows específica con FindWindow, también obtendrá el texto de la ventana que puede ayudarlo. Usando GetWindowThreadProcessId puede detectar si la ventana pertenece a Visual Studio.

+0

Ok. Pero en este caso particular, sé que hay solo una ventana activa a la vez con esa clase de ventana particular, así que eso no es un problema. Probablemente debería haber indicado que en la pregunta :) –

1

simplemente información adicional ..
tal vez es útil saber que se puede obtener el identificador de una ventana desde un punto
WindowFromPoint
http://msdn.microsoft.com/en-us/library/ms633558(VS.85).aspx

+1

WindowFromPoint no se aplica aquí, a menos que esté sugiriendo que el usuario debe apuntar el cursor en esta ventana en un momento o evento específico. – Anders

+1

@Anders, VsTipWindow es una especie de ToolTipWindow. Tooltipwindows tiene la naturaleza de ser visible cuando el mouse está sobre otra ventana y desaparecer cuando el mouse sale de la ventana. pero, sin embargo, WindowFromPoint no tiene nada que ver con el punto del mouse en sí. entrega un identificador de ventana de cada punto arbitrario. Si se aplica aquí o no, no es la pregunta, por favor lea mis primeras 3 palabras. Solo quiero dar otra idea en caso de que la primera idea de Einars no funcione. incluso no sabemos lo que está a punto de hacer – OlimilOops

Cuestiones relacionadas