2009-06-21 34 views
9

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); 
} 
+1

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. –

Odpowiedz

2

Oczywiście - możesz napisać a CBT hook i obejrzeć HCBT_CREATEWND. Zobacz także SetWindowsHookEx().


Zauważ, że to pozwoli Ci być powiadamiany o wszystko tworzenia okno, zanim tworzone okna są jeszcze w pełni zainicjowany. Jeśli wszystko, czego potrzebujesz, nie ma właściciela, okna najwyższego poziomu, RichieHindle's suggestion mogą działać lepiej ...

0

Detours pozwoli ci dołączyć haki do dowolnych funkcji Win32. Jednak sondowanie jest prawdopodobnie bardziej niezawodnym sposobem podejścia do problemu: nie musisz się martwić, czy nie przeoczyłeś konkretnej metody tworzenia okien (ile jest w Win32? Założę się o więcej niż jeden!), I , oczywiście, nie będziesz przepisywanie kodu maszynowego dla funkcji Windows w środowisku wykonawczym.

Ale, wiesz, twój telefon.

+4

James będzie musiał wprowadzić swój kod Detours do każdego procesu GUI, w tym do nowych, które zostały uruchomione. Windows hooks (przez SetWindowsHookEx) są zaprojektowane tak, aby robić dokładnie to, co chce, i są oficjalną częścią Windows API. – RichieHindle

0

Możesz wypróbować bibliotekę WinEventHook dla automatycznego uruchamiania. Spróbuj modyfikację bloker schowek podręczne example z następujących czynności:

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

Powiązane problemy