【发布时间】:2010-11-01 03:54:44
【问题描述】:
尝试了很多东西,但在我的任务栏被核弹和桌面 UI 上的其他超自然效果的情况下,我无法让它始终如一地工作。
首先尝试使用开放库http://mwinapi.sourceforge.net/。虽然它作为一个 OO 层可以很好地用于枚举窗口和其他东西。它不能正确地做钩子
下一站是Dino E.'s post on Windows Hooks in the .Net framework。当我理解文本并试图让它发挥作用时,我最终编写了自己的类型。
我的目的是让这个应用程序运行并让它能够在运行时记录所有创建的窗口。吸引所有人的眼球……
更新:由于显然是您 can't write global windows hooks in .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();
}
【问题讨论】:
-
澄清一下 - SetWindowsHookEx 每次都返回一个有效的句柄。此外,如果有人想尝试这个,上面的代码没有任何其他依赖项。粘贴到空白项目中的 .cs 文件中并运行。