2009-06-21 26 views
9

C'è un modo per utilizzare 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 solo eseguendo il polling dell'elenco delle finestre correnti usando EnumWindows().Come posso ricevere una notifica quando viene creata una nuova finestra su Win32?

Qualcuno ha fatto qualcosa di simile?

Grazie


non sono sicuro se sto facendo questo diritto, ma non sono in grado di ottenere il metodo SetWindowsHookEx al fuoco.

qualcosa ti viene in mente?

qui è il mio elemento di cattura

[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

Poiché WH_SHELL è un gancio iniettato, proprio gancio deve risiedere in una DLL e la DLL deve essere lo stesso numero di bit in cui l'applicazione l'anomalia. E dal momento che stai scrivendo il tuo hook nel codice gestito, il tuo hook deve avere come target la stessa versione del CLR dell'applicazione che solleva l'evento. Ognuna di queste impedirebbe l'esecuzione del tuo hook. Inoltre, il tuo hook viene eseguito nel contesto dell'applicazione che genera l'evento, quindi, anche se viene eseguito, potresti non essere in grado di vedere l'effetto poiché sei nel processo sbagliato. Un hook di accessibilità è probabilmente l'approccio migliore in quanto evita tutti questi problemi. –

risposta

2

Certo - è possibile scrivere a CBT hook e guardare per HCBT_CREATEWND. Vedi anche SetWindowsHookEx().


Si noti che questo vi permetterà all'utente di ricevere notifiche tutta la creazione finestra, davanti alle vetrine si creano sono ancora completamente inizializzato. Se tutto ciò di cui hai bisogno sono finestre esclusive di livello superiore, RichieHindle's suggestion potrebbe funzionare meglio ...

0

Detours ti consentirà di allegare ganci 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 (quante sono in Win32? Scommetto più di una!), E , naturalmente, non sarai riscrivendo il codice macchina per le funzioni di Windows in fase di esecuzione.

Ma, sai, la tua chiamata.

+4

James dovrebbe iniettare il suo codice Detours in ogni processo della GUI, inclusi quelli nuovi che sono stati avviati. Gli hook di Windows (tramite SetWindowsHookEx) sono progettati per fare esattamente ciò che vogliono e sono una parte ufficiale dell'API di Windows. – RichieHindle

0

Si potrebbe provare libreria WinEventHook per autohotkey. Prova a modificare il blocco appunti comparsa example con il seguente:

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 } }