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