Как я могу получить уведомление при создании нового окна на Win32? - PullRequest
10 голосов
/ 22 июня 2009

Есть ли способ использовать Win32, чтобы зарегистрироваться для уведомлений при создании нового окна. Я пытаюсь сохранить список текущих открытых окон, но сейчас просто опрашиваю список текущих окон, используя EnumWindows().

Кто-нибудь делал что-то подобное?

Спасибо


Я не уверен, правильно ли я это делаю, но не могу запустить метод SetWindowsHookEx.

что-нибудь приходит на ум?

вот мой снайпер

[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);
}

Ответы [ 4 ]

12 голосов
/ 22 июня 2009

Используйте SetWindowsHookEx, чтобы установить хук WH_SHELL, и найдите событие HSHELL_WINDOWCREATED.

2 голосов
/ 22 июня 2009

Конечно - вы можете написать крючок CBT и наблюдать за HCBT_CREATEWND. Смотрите также SetWindowsHookEx().


Обратите внимание, что это позволит вам получать уведомления о создании всех окон до того, как создаваемые окна будут даже полностью инициализированы. Если вам нужны только окна верхнего уровня, Предложение RichieHindle может работать лучше ...

0 голосов
/ 28 июня 2009

Вы можете попробовать WinEventHook библиотека для автоматической клавиши. Попробуйте изменить блокнот всплывающих окон в блокноте пример следующим образом:

HookProc( hWinEventHook, Event, hWnd, idObject, idChild, dwEventThread, dwmsEventTime ) { if Event ; EVENT_SYSTEM_FOREGROUND = 0x3 {<br> WinGetTitle, title, ahk_id %hWnd% If (title = "your_window_name" msgbox, your window has been created } }

0 голосов
/ 22 июня 2009

Объезд позволит вам присоединить хуки к произвольным функциям Win32. Однако опрос, вероятно, является более надежным способом решения этой проблемы: вам не нужно беспокоиться о том, пропустили ли вы какой-либо конкретный метод создания окна (сколько их в Win32? Я держу пари больше, чем один!) Конечно, вы не будете переписывать машинный код для функций Windows во время выполнения .

Но, вы знаете, ваш звонок.

...