2009-06-21 21 views
9

¿Hay alguna manera de usar Win32 para registrarse para recibir notificaciones cuando se crea una nueva ventana? Intento mantener una lista de las ventanas abiertas actuales, pero ahora solo estoy sondeando la lista de ventanas actuales usando EnumWindows().¿Cómo puedo recibir una notificación cuando se crea una nueva ventana en Win32?

¿Alguien ha hecho algo similar?

Gracias


no estoy seguro si estoy haciendo bien, pero no soy capaz de obtener el método SetWindowsHookEx al fuego.

¿Algo le viene a la mente?

aquí es mi tijeretazo

[DllImport("user32.dll", SetLastError = true)] 
private static extern IntPtr SetWindowsHookEx(HookType hook, HookProc callback, IntPtr hMod, uint dwThreadId); 

[DllImport("user32.dll")] 
private static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); 
const int HSHELL_WINDOWCREATED = 1; 

private static HookProc winDelegate = ShellHookProcDelegate; 
internal static void RegisterWindowCreatedEvent() 
{ 
    SetWindowsHookEx(HookType.WH_SHELL, winDelegate, IntPtr.Zero, 0); 
} 

private static int ShellHookProcDelegate(int code, IntPtr wParam, IntPtr lParam) 
{ 
    if (code != HSHELL_WINDOWCREATED) 
    { 
     return CallNextHookEx(IntPtr.Zero, code, wParam, lParam); 
    } 

    //App specific code here 

    return CallNextHookEx(IntPtr.Zero, code, wParam, lParam); 
} 
+1

Desde WH_SHELL es un gancho inyectado, su gancho debe residir en una DLL, y la DLL debe ser el mismo valor de bits como la aplicación provocar el evento. Y dado que está escribiendo su gancho en el código administrado, su gancho debe tener como objetivo la misma versión del CLR que la aplicación que plantea el evento. Cualquiera de esos evitaría que tu gancho se ejecute. Además, su gancho se ejecuta en el contexto de la aplicación que genera el evento, por lo que incluso si se ejecuta, es posible que no pueda ver el efecto ya que está en el proceso equivocado. Un gancho de accesibilidad es probablemente el mejor enfoque aquí ya que evita todos estos problemas. –

Respuesta

2

Claro - puede escribir a CBT hook y mirar para HCBT_CREATEWND. Vea también SetWindowsHookEx().


Tenga en cuenta que esto permitirá que se le notifique de toda la creación ventana, antes de que las ventanas están generando son incluso totalmente inicializado. Si todo lo que necesita son ventanas sin propietario, de nivel superior, RichieHindle's suggestion puede funcionar mejor ...

0

Detours le permitirá adjuntar ganchos a funciones arbitrarias de Win32. Sin embargo, la encuesta es probablemente una forma más confiable de abordar el problema: no tiene que preocuparse de si se ha perdido un método particular de creación de ventanas (¿cuántas hay en Win32? ¡Apuesto más de una!), Y , por supuesto, no va a estar reescribiendo el código máquina para las funciones de Windows en tiempo de ejecución.

Pero, ya sabes, su llamada.

+4

James tendría que insertar su código de Detours en cada proceso de la GUI, incluidos los nuevos que se iniciaron. Los ganchos de Windows (a través de SetWindowsHookEx) están diseñados para hacer exactamente lo que él quiere, y son una parte oficial de la API de Windows. – RichieHindle

0

Puede probar la biblioteca WinEventHook para autohotkey. Intente modificar el bloqueador libreta emergente example con lo siguiente:

HookProc(hWinEventHook, Event, hWnd, idObject, idChild, dwEventThread, dwmsEventTime) { if Event ; EVENT_SYSTEM_FOREGROUND = 0x3 {
WinGetTitle, title, ahk_id %hWnd% If (title = "your_window_name" msgbox, your window has been created } }

Cuestiones relacionadas