尝试了很多东西,但在我的任务栏被核弹和桌面 UI 上的其他超自然效果的情况下,我无法让它始终如一地工作。
首先尝试使用开放库http://mwinapi.sourceforge.net/。虽然它作为一个 OO 层可以很好地用于枚举窗口和其他东西。它不能正确地做钩子
下一站是Dino E. 在 .Net 框架中的 Windows Hooks 上的帖子。当我理解文本并试图让它发挥作用时,我最终编写了自己的类型。
我的目的是让这个应用程序运行并让它能够在运行时记录所有创建的窗口。唤起所有的眼球...
更新:由于显然您不能在 .Net / 托管代码中编写全局窗口挂钩(除了一些低级鼠标或键盘挂钩) ,因此被剪掉了
所以我切换到C++。仍然所有 WinAPI 调用都返回有效句柄,但我没有看到我的过滤器函数被调用 - 似乎没有收到任何通知。仍然不起作用...有人可以发现错误。
void CWinHookFacade::Hook()
{
HMODULE hCurrentDll = LoadLibrary(_T("[Path to my hook dll]"));
m_HookHandle = SetWindowsHookEx(WH_CBT,
FilterFunctionForHook,
hCurrentDll,
0);
if (m_HookHandle == NULL)
{
throw new std::exception("Unable to hook");
}
}
void CWinHookFacade::Unhook()
{
if (!UnhookWindowsHookEx(m_HookHandle))
{
throw new std::exception("Unhook failed!");
}
m_HookHandle = NULL;
}
LRESULT CWinHookFacade::FilterFunctionForHook(int code, WPARAM wParam, LPARAM lParam)
{
if (code >= 0)
{
switch(code)
{
case HCBT_CREATEWND:
wprintf(_T("Created Window"));
break;
case HCBT_ACTIVATE:
wprintf(_T("Activated Window"));
break;
case HCBT_DESTROYWND:
wprintf(_T("Destroy Window"));
break;
}
}
return CallNextHookEx(m_HookHandle, code, wParam, lParam);
}
客户端 exe 像这样调用 Hook_DLL
int _tmain(int argc, _TCHAR* argv[])
{
CWinHookFacade::Hook();
getchar();
CWinHookFacade::Unhook();
}