2012-01-06 9 views
6

Si una ventana, por ejemplo Firefox, cambia su título, de Firefox a Stack Overflow - Firefox luego quiero que mi aplicación registre que Firefox cambió su título.Evento de título cambiado de ventana

¿Esto es posible sin el uso de un gancho y lazo (EnumWindows)? Si solo se puede hacer con un gancho, ¿qué tipo de gancho?

+0

¿Estás hablando de un solo navegador así como de redirecciones ...? ¿Ha buscado en Solicitud/Respuesta y accediendo a los encabezados? Sólo curiosidad por si estoy en la misma página que usted .. – MethodMan

+1

Sí, se requiere un gancho. Estoy bastante seguro de que ya te conté sobre WH_SHELL. –

+1

posible duplicado de [Registrar todas las ventanas que están cerradas en Windows] (http://stackoverflow.com/questions/8648386/log-all-windows-that-are-closed-in- windows) –

Respuesta

9

WinEvents es el camino a seguir aquí. La API que necesita es SetWinEventHook() - si le importa una ventana específica, use GetWindowThreadProcessId() para obtener el threadId de HWND y luego escuche los eventos solo de esa secuencia específica. Para los cambios de título de ventana, querrá el evento EVENT_OBJECT_NAMECHANGE.

Puede conectar "en contexto" o "fuera de contexto"; este último es el más simple, y significa que el evento se devuelve a su propio proceso, por lo que no necesita una DLL separada, lo que hace es posible hacerlo todo en C#; pero el hilo que llama a SetWinEventHook debe tener un bucle de mensaje (GetMessage/TranslateMessage/DispatchMessage), ya que los eventos se entregan usando una forma de mensajes detrás de escena.

En su devolución de llamada de WinEvent, deberá comprobar que HWND es lo que más le importa, ya que obtendrá cambios de nombre para cualquier UI en esa cadena de destino, posiblemente incluyendo cambios de nombre de ventana secundarios u otras cosas no te importa

-

Por cierto, se puede comprobar this answer por algún código de ejemplo de C# que utiliza WinEvents; los está usando para rastrear cambios de ventana en primer plano en todas las ventanas del escritorio; pero debería simplemente tomar unas simples modificaciones descritas arriba para seguir los cambios de nombre en una ventana específica.

+1

EVENT_OBJECT_NAMECHANGE se produce mucho, se activa incluso cuando mueve el mouse en la misma pestaña de la misma ventana. ¿Está relacionado con lo que dijiste "posiblemente incluyendo cambios de nombre de ventana secundarios", pero cómo evitarlo? simplemente ignorando los mismos "títulos de ventana" recurrentes en la devolución de llamada? – JohnTube

+1

Si solo está interesado en cambios en un proceso, puede especificar el ID del proceso en la llamada 'SetWindowEventHook', lo que reducirá en gran medida la cantidad de eventos observados. –

+0

@BrendanMcK Obtengo títulos cuando cambio ventanas, por ej. desde chome> notepad> visualstudio pero no obteniendo cómo implementar evento para cambio de tabulación de cromo o cambio de documento en visualstudio. ¿puedes ayudar? Saludos –

3

Necesitará un gancho (o la técnica de votación que mencionó en su pregunta).

Básicamente en la API de Windows, para cambiar el "título de la ventana" - o más precisamente el texto de una ventana - envía WM_SETTEXT, por lo que su gancho debe interceptar ese mensaje. El tipo de enlace que necesita es WH_CALLWNDPROC y simplemente verifique si el mensaje que está recibiendo es WM_SETTEXT y hWnd es la ventana principal de la aplicación que está viendo (para que no obtenga falsos positivos como la aplicación que intenta establecer el texto de ventanas para niños).

Nota pequeña aquí: Si bien este no es el caso aquí, tenga en cuenta que el título que ve puede simplemente dibujarse allí manualmente, sin pasar por la API habitual de Windows. Use Spy ++ o algo para ver qué sucede antes de ir demasiado lejos en esta ruta, puede pasar mucho tiempo sin nada.

+1

Esto funcionará, pero no es la manera más fácil. La captura con un gancho WH_CALLWNDPROC es que necesitarás una DLL C/C++ separada; no puedes hacerlo todo en C#. (Además, necesitarás ganchos separados para el código de 32 y 64 bits, si te importa eso). SetWinEventHook probablemente se ajuste mejor aquí, ya que puedes hacer que la notificación se devuelva a tu propio proceso, evitando la necesidad de un DLL separado. – BrendanMcK

+0

Ya has publicado tu respuesta, ¿para qué molestarse con este comentario? – Blindy

+5

Para que un potencial futuro lector de SO entienda cómo las dos técnicas se relacionan entre sí, o verá esta advertencia incluso si la única exploración es la respuesta aceptada; un comentario tiene mejor localidad espacial que la respuesta separada. – BrendanMcK

-7

No necesita ningún gancho. Simplemente use los eventos de Windows

+3

....... como? – LarsTech

+0

@fred, esta no es una respuesta muy útil: Windows tiene muchas características disponibles que podrían describirse como eventos. Si buscas en Google "Eventos de viudas", obtienes un golpe para el registro de eventos de Windows como la primera coincidencia, que es una tecnología totalmente no relacionada. Al menos, proporcione un nombre de API o similar, preferiblemente con un enlace, para que el lector comprenda de qué está hablando. – BrendanMcK

Cuestiones relacionadas