Pergunta

Existe uma maneira usando Win32, para registrar para notificações quando uma nova janela é criada. Eu estou tentando manter uma lista de janelas abertas atuais, mas agora sou apenas polling a lista de janelas actuais utilizando EnumWindows().

Qualquer pessoa fez algo semelhante?

Graças


Eu não tenho certeza se estou fazendo a coisa certa, mas eu não sou capaz de conseguir o método SetWindowsHookEx ao fogo.

qualquer coisa vêm à mente?

aqui é o meu snip

[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);
}
Foi útil?

Solução

Use SetWindowsHookEx a criação de um < a href = "http://msdn.microsoft.com/en-us/library/ms644991(VS.85).aspx" rel = "noreferrer"> WH_SHELL gancho e olhar para o evento HSHELL_WINDOWCREATED.

Outras dicas

Claro - você pode escrever um CBT gancho e relógio para HCBT_CREATEWND. Veja também SetWindowsHookEx() .


Note que isto irá permitir que você seja notificado de todas criação de janela, antes de as janelas sendo criadas são ainda totalmente inicializado. Se tudo que você precisa são sem dono, janelas de nível superior, de RichieHindle sugestão pode funcionar melhor ...

Detours permitirá que você anexar ganchos para funções arbitrárias Win32. No entanto, a votação é provavelmente a maneira mais confiável de abordar o problema: você não tem que se preocupar se você perdeu um método de janela de criação de particular (como muitos estão lá em Win32 Aposto mais do que um?!), E , é claro, você não será reescrever o código de máquina para funções do Windows em tempo de execução .

Mas, você sabe, a sua chamada.

Você poderia tentar biblioteca WinEventHook para autohotkey. Tente modificar o bloco de notas pop-up blocker exemplo com o seguinte :

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top