有没有办法使用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 事件。

其他提示

当然 - 你可以写 CBT挂钩并注意<代码> HCBT_CREATEWND 。另请参见 SetWindowsHookEx()


请注意,这将允许您在创建的窗口甚至完全初始化之前收到所有窗口创建的通知。如果您需要的只是无主,顶级窗口, RichieHindle的建议可能会更好......

Detours 将允许您将挂钩附加到任意Win32功能。但是,轮询可能是解决问题的一种更可靠的方法:您不必担心是否错过了特定的窗口创建方法(Win32中有多少个?我打赌不止一个!),当然,你不会在运行时重写Windows功能的机器代码

但是,你知道,你的电话。

您可以尝试使用 WinEventHook 库来获取autohotkey。 尝试使用以下内容示例修改记事本弹出窗口拦截器:

HookProc(hWinEventHook,Event,hWnd,idObject,idChild,dwEventThread,dwmsEventTime) {    如果事件; EVENT_SYSTEM_FOREGROUND = 0x3    {点击       WinGetTitle,title,ahk_id%hWnd%       如果(title =&quot; your_window_name&quot;          msgbox,您的窗口已创建    } }

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top