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);
}
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. –