Как я могу получать уведомления о создании нового окна в Win32?

StackOverflow https://stackoverflow.com/questions/1024756

  •  06-07-2019
  •  | 
  •  

Вопрос

Есть ли способ, используя 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);
}
Это было полезно?

Решение

Использование SetWindowsHookEx чтобы настроить WH_SHELL зацепите и поищите HSHELL_WINDOWCREATED событие.

Другие советы

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


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

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

Но, ты знаешь, тебе решать.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top