我是 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 它没有给出正确的名称。我怎样才能得到正确的名字?
如果你想检测正在创建哪些窗口,你应该创建一个为/安装全局钩子的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)