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

Raj*_*Raj 1 c++ hook winapi

我是 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);
}
Run Code Online (Sandbox Code Playgroud)

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

huy*_*itw 5

如果你想检测正在创建哪些窗口,你应该创建一个为/安装全局钩子的DLL :WH_CBTCBTProc

g_hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, g_hInstance, 0);
Run Code Online (Sandbox Code Playgroud)

对于每个创建的窗口,CBTProc将使用以下参数进行调用:CBTProc(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);
}
Run Code Online (Sandbox Code Playgroud)