【问题标题】:HWND Creation TimeHWND 创建时间
【发布时间】:2012-05-26 00:07:15
【问题描述】:

我是这个社区的新手,在使用我的一个自动化脚本时遇到了一个问题,我想获得 HWND 的创建时间。

我从 FindWindowEx 检索到的数组中有一组 HWND, 我想根据系统时间在数组中找到最后创建的 HWND

我没有足够的窗口挂钩知识,但是我读到了一些 CBTproc,它有一些名为“CBT_CREATEWND”的事件,它可以在窗口即将创建时返回 HWND,我非常不确定如何使用窗户挂钩 但如果我会得到 HWND,我可以获取系统时间并与我的数组的 HWND 进行比较。

任何人都可以提出一些相同的问题,如果我不清楚,也可以要求我进行更多详细说明。

谢谢, 曼尼什班萨尔

【问题讨论】:

    标签: winapi


    【解决方案1】:

    Windows 不会以可通过 API 访问的方式存储此信息,因此您必须自己收集。

    如果您可以修改创建 HWND 的代码,您可以在处理 WM_CREATE 或 WM_NCCREATE 时存储当前时间。

    如果可能,我会避免使用窗口挂钩 - 它们会将您的 DLL 注入到创建窗口的每个进程中。 DLL 中的严重错误将导致桌面上的每个应用程序都死掉。

    如果你必须使用 windows 钩子,你可以像这样使用SetWindowsHookEx 注入钩子:

    HHOOK myHook = SetWindowsHookEx(WH_CBT, MyHookFunction, myHookDll, 0);
    

    你的钩子进程将如下所示:

    LRESULT CALLBACK MyHookFunction(int nCode, WPARAM wParam, LPARAM lParam)
    {
       if (nCode == HCBT_CREATEWND)
       {
            // wParam is new window.
       }
       else if (nCode == HCBT_DESTROYWND)
       {
            // wParam is window being destroyed
       }
    
       return CallNextHookEx(myHook, nCode, wParam, lParam);
    }
    

    hook proc 需要存在于 DLL 中,因此它可以被其他进程加载。由于您的挂钩将在不同的进程中运行,因此您需要将信息编组回原始进程。例如,您可以通过自定义窗口消息来执行此操作。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2017-11-08
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多