我正在尝试创建一个应用程序,该应用程序将通知Windows中每个活动窗口更改,以便它可以执行一些任务,例如检测窗口标题,因此"惩罚"坏人在我们的PC机上访问不良内容。因此,这对于应用程序非常重要,因为它的目的是记录"坏"历史应用。
所以,在我的main函数中,我为WindowLogger
启动了一个帖子。
windowThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) WindowLogger,
(LPVOID) argv[0], 0, NULL );
if (windowThread)
{
// Also a bit of protection here..
return WaitForSingleObject(windowThread, INFINITE);
}
然后,这是我的WindowLogger
程序:
// Function called by main function to install hook
DWORD WINAPI
WindowLogger(LPVOID lpParameter)
{
HHOOK hWinHook;
HINSTANCE hExe = GetModuleHandle(NULL);
if (!hExe)
{
return 1;
}
else
{
hWinHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, hExe, 0);
MSG msg;
// I AM UNSURE ABOUT THIS PART..
// Probably wrong code :D ..
while (GetMessage(&msg, NULL, 0, 0) != 0)
{
if (msg.message == HCBT_ACTIVATE) {
// my code to log the window name
}
}
UnhookWindowsHookEx(hWinHook);
}
return 0;
}
最后,我的CBTProc
回调函数,它使用我的log()
函数记录窗口:
LRESULT CALLBACK
CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
switch (nCode)
{
case HCBT_ACTIVATE:
{
HWND foreground = GetForegroundWindow();
char window_title[50];
if (foreground)
GetWindowText(foreground, window_title, 25);
log("|");
log(&window_title[0]);
log("|");
}
}
}
所以我调试了程序,我发现hWinHook
在NULL
之后成为SetWindowsHookEx()
- 这可能导致我的程序邮件功能...
你能帮我解决这个问题吗?
提前致谢。
答案 0 :(得分:2)
将0
参数dwThreadId
传递给SetWindowsHookEx
用于为系统中的所有线程注册挂钩,即全局挂钩。但是,要执行此操作,您的钩子代码需要位于DLL中(以便DLL可以映射到其他进程的地址空间)。由于您的钩子代码在主要的可执行文件而不是DLL中,因此调用失败。