Pregunta

¿Hay alguna manera de usar Win32 para registrarse para recibir notificaciones cuando se crea una nueva ventana? Estoy tratando de mantener una lista de ventanas abiertas actuales, pero ahora solo estoy sondeando la lista de ventanas actuales usando EnumWindows () .

¿Alguien ha hecho algo similar?

Gracias


No estoy seguro si estoy haciendo esto bien, pero no puedo hacer que se active el método SetWindowsHookEx.

¿algo te viene a la mente?

aquí está mi recorte

[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);
}
¿Fue útil?

Solución

Use SetWindowsHookEx para configurar un WH_SHELL enganche y busque el evento HSHELL_WINDOWCREATED .

Otros consejos

Claro, puede escribir un gancho CBT y observar HCBT_CREATEWND . Consulte también SetWindowsHookEx () .


Tenga en cuenta que esto le permitirá recibir notificaciones de la creación de ventanas all , incluso antes de que las ventanas que se crean se inicialicen por completo. Si todo lo que necesita son ventanas de nivel superior sin propietario, sugerencia de RichieHindle puede funcionar mejor ...

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

Pero, ya sabes, tu llamada.

Puede probar la biblioteca WinEventHook para autohotkey. Intente modificar el bloqueador de ventanas emergentes del bloc de notas ejemplo con lo siguiente :

HookProc (hWinEventHook, Event, hWnd, idObject, idChild, dwEventThread, dwmsEventTime) {    si evento; EVENT_SYSTEM_FOREGROUND = 0x3    {
      WinGetTitle, título, ahk_id% hWnd%       Si (title = " your_window_name "          msgbox, tu ventana ha sido creada    } }

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top