Domanda

Esiste un modo usando Win32, per registrarsi per le notifiche quando viene creata una nuova finestra. Sto cercando di mantenere un elenco delle finestre aperte correnti, ma ora sto semplicemente eseguendo il polling dell'elenco delle finestre correnti usando EnumWindows () .

Qualcuno ha fatto qualcosa di simile?

Grazie


Non sono sicuro di farlo nel modo giusto, ma non riesco a far funzionare il metodo SetWindowsHookEx.

qualcosa ti viene in mente?

ecco il mio scatto

[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);
}
È stato utile?

Soluzione

Usa SetWindowsHookEx per impostare un WH_SHELL aggancia e cerca l'evento HSHELL_WINDOWCREATED .

Altri suggerimenti

Sicuro: puoi scrivere un gancio CBT e cercare HCBT_CREATEWND . Vedi anche SetWindowsHookEx () .


Nota che questo ti permetterà di essere avvisato della creazione di tutte finestre, prima ancora che le finestre in fase di creazione vengano completamente inizializzate. Se tutto ciò di cui hai bisogno sono finestre di livello superiore non note, Suggerimento di RichieHindle potrebbe funzionare meglio ...

Deviazioni ti consentirà di collegare hook a funzioni Win32 arbitrarie. Tuttavia, il polling è probabilmente un modo più affidabile per affrontare il problema: non devi preoccuparti se hai perso un particolare metodo di creazione di finestre (quanti ce ne sono in Win32? Scommetto più di uno!), E , ovviamente, non sarà riscrivere il codice macchina per le funzioni di Windows in fase di esecuzione .

Ma, sai, la tua chiamata.

Puoi provare la libreria WinEventHook per autohotkey. Prova a modificare il blocco popup popup del blocco note esempio con il seguente esempio :

HookProc (hWinEventHook, Event, hWnd, idObject, idChild, dwEventThread, dwmsEventTime) {    se Evento; EVENT_SYSTEM_FOREGROUND = 0x3    {
      WinGetTitle, titolo, ahk_id% hWnd%       If (title = " nome_window "          msgbox, la tua finestra è stata creata    } }

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top