挂钩创建窗口并想要获取类名

Posted

技术标签:

【中文标题】挂钩创建窗口并想要获取类名【英文标题】:Hooking for create window and want to get class name 【发布时间】:2013-08-12 13:16:51 【问题描述】:

我是 C++ 和 Hooking 的新手。为了创建窗口挂钩,我使用以下代码

static HRESULT WINAPI HookCreateWindowEx(
    __in      DWORD dwExStyle,
    __in_opt  LPCTSTR lpClassName,
    __in_opt  LPCTSTR lpWindowName,
    __in      DWORD dwStyle,
    __in      int x,
    __in      int y,
    __in      int nWidth,
    __in      int nHeight,
    __in_opt  HWND hWndParent,
    __in_opt  HMENU hMenu,
    __in_opt  HINSTANCE hInstance,
    __in_opt  LPVOID lpParam
    )

      return TrueCreateWindowEx(dwExStyle,lpClassName, lpWindowName, dwStyle, x, y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam);

在这里我想知道 lpClassName 它没有给出正确的名称。我怎样才能得到正确的名字?

【问题讨论】:

如果你描述了你得到的类名和你期望的类名,这会有所帮助。系统似乎相处得很好,所以类名不可能全错。此外,挂钩通常是最后的手段。根据您的要求,可能会有更好的选择。 我在 MSDN 上找不到“HookCreateWindowEx”。 另请注意:lpClassName 可能是类原子。 @MartinJames:Raj 很可能使用 Detours 或类似的挂钩库将 CreateWindowEx() 替换为他自己的 HookCreateWindowEx() 函数。 【参考方案1】:

如果您想检测正在创建哪些窗口,您应该创建一个 DLL,其中 installs 是 WH_CBT / CBTProc 的全局挂钩:

g_hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, g_hInstance, 0);

对于每个创建的窗口,将使用以下参数调用CBTProcCBTProc(HCBT_CREATEWND, HWND hwndOfNewWindow, CBT_CREATEWND cbtCreateWnd)

所以你的CBTProc 应该是这样的:

SUPPRESSDIALOGHOOK_API LRESULT CALLBACK CBTProc(__in  int nCode, __in  WPARAM wParam, __in  LPARAM lParam)

    if (nCode == HCBT_CREATEWND)
    
        // wParam = handle to the new window
        // lParam = long pointer to a CBT_CREATEWND structure
        HWND hwnd = (HWND)wParam;
        CHAR name[1024] = 0;
        GetClassName(hwnd, name, sizeof(name));
    

    return CallNextHookEx(g_hHook, nCode, wParam, lParam);

【讨论】:

嗨,Wouter Huysentruit,最初我使用了这个代码codeproject.com/Articles/67091/…,但有时它没有挂钩。 social.msdn.microsoft.com/Forums/vstudio/en-US/… 那为什么我使用 HookCreateWindowEx 而不是 SetWindowsHookEx 你能帮我吗 HookCreateWindowEx 不是有效的 Windows API 函数,Google 博士说。但无论如何,那篇 codeproject 文章应该是一个好的开始。首先尝试让键盘/鼠标挂钩从单独的 DLL 工作,然后修改它并挂钩到 WM_CBT,如我的回答中所述。 嗨 Wouter Huysentruit,您对此有何看法 [social.msdn.microsoft.com/Forums/vstudio/en-US/… 已经测试了我在这里的 CBT 挂钩代码,它适用于 Win7 x64。唯一的问题是,如果您的钩子 DLL 调用需要正确用户权限的函数,f.e.写入文件,您必须确保您启动的每个进程都有权写入该文件,因为挂钩 DLL 将被注入到每个启动的进程中。

以上是关于挂钩创建窗口并想要获取类名的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++ 窗口创建失败

在mfc中窗口名称和窗口类名有啥区别,在create的时候!

QT:获取对象的类名

Windows 全局键盘挂钩 - Delphi

windows 下在进程中使用createprocess创建一个窗口进程,并获取这个窗口HWND句柄

挂钩到 VBE 窗口的子类 SysTreeView32