0

我是 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 它没有给出正确的名称。我怎样才能得到正确的名字?

4

1 回答 1

4

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

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

对于每个创建的窗口,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);
}
于 2013-08-12T13:57:15.063 回答