我正在尝试加入 Windows 的大小调整事件。我写了以下钩子:
__declspec(dllexport)
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
MSG *msg = (MSG *)lParam;
wchar_t text[1014];
GetWindowText(msg->hwnd, text, 1024);
if (wcscmp(text, L"Untitled - Notepad") == 0)
{
if (nCode == HCBT_MOVESIZE)
{
FILE *file;
fopen_s(&file, "C:\\Users\\Me\\hooklog.txt", "a+");
fprintf(file, "Move or size.\n");
fclose(file);
}
else
{
FILE *file;
fopen_s(&file, "C:\\Users\\Me\\hooklog.txt", "a+");
fprintf(file, "Something else.\n");
fclose(file);
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
我正在尝试使用以下方法安装它:
HHOOK hhk = SetWindowsHookEx(WH_CBT, hookProc, hModule, 0);
DWORD err = GetLastError();
相同的技术适用于其他类型的钩子,但 fot WH_CBT 不起作用。所涉及的所有变量(调用后的hookProc、hModule和hhk以及err为0)都有合理的值,并且没有错误的迹象。在日志文件中没有任何显示。
工作版本
我注意到 nCode 的使用取决于钩子的类型,但我完全忘记检查其他参数;正如汉斯注意到的那样, lParam没有指向带有nCode == HCBT_MOVESIZE的WH_CBT的味精;相反,lParam指向新的RECT并且可以从wParam检索HWND。
__declspec(dllexport)
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HCBT_MOVESIZE)
{
wchar_t text[1014];
GetWindowText((HWND)wParam, text, 1024);
if (wcscmp(text, L"Untitled - Notepad") == 0)
{
RECT *rect = (RECT *)lParam;
FILE *file;
fopen_s(&file, "C:\\Users\\Me\\hooklog.txt", "a+");
fprintf(file, "Move or size (%d, %d, %d, %d) for target window.\n", rect->left, rect->right, rect->top, rect->bottom);
fclose(file);
}
else
{
FILE *file;
fopen_s(&file, "C:\\Users\\Me\\hooklog.txt", "a+");
fprintf(file, "Move or size for some other window.\n");
fclose(file);
}
}
else
{
FILE *file;
fopen_s(&file, "C:\\Users\\Me\\hooklog.txt", "a+");
fprintf(file, "Something else.\n");
fclose(file);
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}