使用 SetWindowsHookEx 观察打开 windows
Observe opened windows with SetWindowsHookEx
我正在尝试使用全局 Windows 挂钩观察打开和关闭 windows。因此,我试图将回调函数传递给包含我的挂钩过程的 DLL。但是,挂钩过程本身永远不会被调用。
/** Handle to this DLL */
HINSTANCE dllModule = 0;
/** Hook procedure */
HHOOK windowHook = 0;
/** Callbacks are called when a new window is opened, or closed. */
HWND_CALLBACK windowOpenCallback = 0;
HWND_CALLBACK windowCloseCallback = 0;
WINDOWHOOK_API int WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved)
{
if(reason == DLL_PROCESS_ATTACH)
{
dllModule = hInstance;
std::cout << "Process attached." << std::endl;
}
else if (reason == DLL_PROCESS_DETACH)
{
std::cout << "Process detached." << std::endl;
}
else if (reason == DLL_THREAD_ATTACH)
{
}
else if (reason == DLL_THREAD_DETACH)
{
}
return 1;
}
WINDOWHOOK_API bool setWindowHook(HWND_CALLBACK openCallback, HWND_CALLBACK closeCallback)
{
if(windowHook != 0 || windowOpenCallback != 0 || windowCloseCallback != 0)
{
return false;
}
windowOpenCallback = openCallback;
windowCloseCallback = closeCallback;
windowHook = SetWindowsHookEx(WH_SHELL, (HOOKPROC)hookCallback, dllModule, 0);
return windowHook != 0;
}
WINDOWHOOK_API bool releaseWindowHook()
{
bool result = windowHook != 0 && UnhookWindowsHookEx(windowHook) != 0;
windowHook = 0;
windowOpenCallback = 0;
windowCloseCallback = 0;
return result;
}
LRESULT CALLBACK hookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
std::cout << "Hook callback" << std::endl;
return CallNextHookEx(windowHook, nCode, wParam, lParam);
}
在我的主程序中,我加载了库并调用了 setWindowHook 过程。然后我简单地启动一个无限循环并等待挂钩被调用,但是尽管 setWindowHook 没有失败,挂钩过程从未被调用。我不明白为什么。
我尝试设置一个 WH_KEYBOARD 挂钩。这样,钩子过程就会在按键上被调用,但前提是它们在我程序的控制台 window 内。
我正在 64 位机器上将其编译为 32 位。但是,它不应该至少适用于我所有的 32 位应用程序吗?
提前致谢。
谢谢,我让它与 DLL 一起工作,SetWindowsHookEx, however the SetWinEventHook 解决方案工作得更好,你不需要 DLL。
唯一的问题是,WINEVENTHOOK 没有我们可以将 class 实例传递给的 LPVOID 指针属性。因此,如果您正在寻找面向对象的方法并且正在为此苦苦挣扎,this codeproject link 可能会有所帮助。
还要确保,无论您从哪个线程设置挂钩,都有一个消息循环,否则您将不会收到任何事件。
while (!stopped)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
// you don't have to do anything here
}
}
我正在尝试使用全局 Windows 挂钩观察打开和关闭 windows。因此,我试图将回调函数传递给包含我的挂钩过程的 DLL。但是,挂钩过程本身永远不会被调用。
/** Handle to this DLL */
HINSTANCE dllModule = 0;
/** Hook procedure */
HHOOK windowHook = 0;
/** Callbacks are called when a new window is opened, or closed. */
HWND_CALLBACK windowOpenCallback = 0;
HWND_CALLBACK windowCloseCallback = 0;
WINDOWHOOK_API int WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved)
{
if(reason == DLL_PROCESS_ATTACH)
{
dllModule = hInstance;
std::cout << "Process attached." << std::endl;
}
else if (reason == DLL_PROCESS_DETACH)
{
std::cout << "Process detached." << std::endl;
}
else if (reason == DLL_THREAD_ATTACH)
{
}
else if (reason == DLL_THREAD_DETACH)
{
}
return 1;
}
WINDOWHOOK_API bool setWindowHook(HWND_CALLBACK openCallback, HWND_CALLBACK closeCallback)
{
if(windowHook != 0 || windowOpenCallback != 0 || windowCloseCallback != 0)
{
return false;
}
windowOpenCallback = openCallback;
windowCloseCallback = closeCallback;
windowHook = SetWindowsHookEx(WH_SHELL, (HOOKPROC)hookCallback, dllModule, 0);
return windowHook != 0;
}
WINDOWHOOK_API bool releaseWindowHook()
{
bool result = windowHook != 0 && UnhookWindowsHookEx(windowHook) != 0;
windowHook = 0;
windowOpenCallback = 0;
windowCloseCallback = 0;
return result;
}
LRESULT CALLBACK hookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
std::cout << "Hook callback" << std::endl;
return CallNextHookEx(windowHook, nCode, wParam, lParam);
}
在我的主程序中,我加载了库并调用了 setWindowHook 过程。然后我简单地启动一个无限循环并等待挂钩被调用,但是尽管 setWindowHook 没有失败,挂钩过程从未被调用。我不明白为什么。
我尝试设置一个 WH_KEYBOARD 挂钩。这样,钩子过程就会在按键上被调用,但前提是它们在我程序的控制台 window 内。
我正在 64 位机器上将其编译为 32 位。但是,它不应该至少适用于我所有的 32 位应用程序吗?
提前致谢。
谢谢,我让它与 DLL 一起工作,SetWindowsHookEx, however the SetWinEventHook 解决方案工作得更好,你不需要 DLL。 唯一的问题是,WINEVENTHOOK 没有我们可以将 class 实例传递给的 LPVOID 指针属性。因此,如果您正在寻找面向对象的方法并且正在为此苦苦挣扎,this codeproject link 可能会有所帮助。
还要确保,无论您从哪个线程设置挂钩,都有一个消息循环,否则您将不会收到任何事件。
while (!stopped)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
// you don't have to do anything here
}
}