Comment puis-je être averti lorsqu'une nouvelle fenêtre est créée sur Win32?

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

  •  06-07-2019
  •  | 
  •  

Question

Existe-t-il un moyen d’utiliser Win32 pour enregistrer les notifications lorsqu’une nouvelle fenêtre est créée. J'essaie de conserver une liste des fenêtres actuellement ouvertes, mais je ne fais que consulter la liste des fenêtres actuelles à l'aide de EnumWindows () .

Quelqu'un a fait quelque chose de similaire?

Merci

Je ne suis pas sûr de bien faire les choses, mais je ne parviens pas à activer la méthode SetWindowsHookEx.

quelque chose vous vient à l'esprit?

voici mon 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);
}
Était-ce utile?

La solution

Utilisez SetWindowsHookEx pour configurer un WH_SHELL raccrocher et rechercher l'événement HSHELL_WINDOWCREATED .

Autres conseils

Bien sûr, vous pouvez écrire un point d'ancrage CBT et surveiller HCBT_CREATEWND . Voir aussi SetWindowsHookEx () .

Notez que cela vous permettra d'être averti de la création de toutes toutes les fenêtres, avant même que les fenêtres en cours de création ne soient complètement initialisées. Si vous avez uniquement besoin de fenêtres de premier niveau non propriétaires, suggestion de RichieHindle peut fonctionner mieux ...

Détours vous permettra d'attacher des points d'ancrage à des fonctions Win32 arbitraires. Cependant, les sondages sont probablement une façon plus fiable d’aborder le problème: vous n’avez pas à vous demander si vous avez oublié une méthode de création de fenêtre particulière (combien y a-t-il dans Win32? Je parie plus d’un!), Et bien sûr, vous ne serez pas en train de réécrire le code machine pour les fonctions Windows au moment de l'exécution .

Mais vous connaissez votre appel.

Vous pouvez essayer la bibliothèque WinEventHook pour autohotkey. Essayez de modifier le bloqueur de bloc-notes du bloc-notes exemple avec les éléments suivants :

HookProc (hWinEventHook, événement, hWnd, idObject, idChild, dwEventThread, dwmsEventTime) {    si événement; EVENT_SYSTEM_FOREGROUND = 0x3    {
      WinGetTitle, titre, ahk_id% hWnd%       Si (title = " your_window_name "          msgbox, votre fenêtre a été créée    } }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top