挂钩创建窗口并想要获取类名
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);
对于每个创建的窗口,将使用以下参数调用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);
【讨论】:
嗨,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 将被注入到每个启动的进程中。以上是关于挂钩创建窗口并想要获取类名的主要内容,如果未能解决你的问题,请参考以下文章
在mfc中窗口名称和窗口类名有啥区别,在create的时候!