Czy istnieje sposób korzystania z Win32, aby zarejestrować się do powiadomień, gdy tworzone jest nowe okno. Próbuję zachować listę bieżących otwartych okien, ale teraz właśnie odpytuję listę bieżących okien przy użyciu EnumWindows()
.Jak mogę otrzymać powiadomienie, gdy nowe okno zostanie utworzone na Win32?
Ktoś zrobił coś podobnego?
Dzięki
Nie jestem pewien, czy robię to dobrze, ale nie jestem w stanie uzyskać metoda SetWindowsHookEx na ogień.
cokolwiek przychodzi ci na myśl?
tutaj jest mój wycinek
[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);
}
Od WH_SHELL jest wstrzykiwany hak, hak musi znajdować się w bibliotece DLL, a DLL musi być taka sama bitness jak stosowanie powodującemu zdarzenie. A ponieważ piszesz swój hak w zarządzanym kodzie, twój hak musi trafić na tę samą wersję CLR, co aplikacja podnosząca wydarzenie. Każda z nich uniemożliwi uruchomienie haka. Twój hak działa również w kontekście aplikacji podnoszącej wydarzenie, więc nawet jeśli działa, możesz nie być w stanie zobaczyć efektu, ponieważ jesteś w złym procesie. Haczyk ułatwień dostępu jest prawdopodobnie najlepszym rozwiązaniem, ponieważ pozwala uniknąć wszystkich tych problemów. –