在过去的几个小时里,以下代码一直给我带来一些麻烦。 我正在尝试编写一个小程序(基于网络上的一些教程),它使用 WH_JOURNALRECORD 窗口 Hook 来记录击键。
主要代码:
#include "StdAfx.h"
#include <tchar.h>
#include <iostream>
#include <windows.h>
using std::cout;
using std::endl;
int _tmain(int argc, _TCHAR* argv[]) {
HINSTANCE hinst = LoadLibrary(_T("testdll3.dll"));
typedef void (*Install)();
typedef void (*Uninstall)();
Install install = (Install) GetProcAddress(hinst, "install");
Uninstall uninstall = (Uninstall) GetProcAddress(hinst, "uninstall");
install();
int foo;
std::cin >> foo;
cout << "Uninstalling" << endl;
uninstall();
return 0;
}
动态链接库代码:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
HHOOK hhk;
HHOOK hhk2;
LRESULT CALLBACK journalRecordProc(int code, WPARAM wParam, LPARAM lParam) {
FILE * fileLog = fopen("journal.txt", "a+");
fprintf(fileLog,"loggedJournal\n");
fclose(fileLog);
CallNextHookEx(hhk,code,wParam,lParam);
return 0;
}
LRESULT CALLBACK wireKeyboardProc(int code,WPARAM wParam,LPARAM lParam) {
FILE * fileLog = fopen("keyboard.txt", "a+");
fprintf(fileLog,"loggedKeyboard\n");
fclose(fileLog);
CallNextHookEx(hhk,code,wParam,lParam);
return 0;
}
extern "C" __declspec(dllexport) void install() {
HINSTANCE thisDllInstance = LoadLibrary(_T("testdll3.dll"));
hhk = SetWindowsHookEx(WH_JOURNALRECORD, journalRecordProc, thisDllInstance, NULL);
hhk2 = SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc, thisDllInstance, NULL);
}
extern "C" __declspec(dllexport) void uninstall() {
UnhookWindowsHookEx(hhk);
UnhookWindowsHookEx(hhk2);
}
BOOL WINAPI DllMain( __in HINSTANCE hinstDLL, __in DWORD fdwReason, __in LPVOID lpvReserved) {
return TRUE;
}
出于某种原因,键盘 Hook (SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc,..)) 有效(创建了“keyboard.txt”文件),但日志 Hook (SetWindowsHookEx(WH_JOURNALRECORD, journalRecordProc,...))没有。也就是说,永远不会调用日志 Hook 的回调(永远不会创建 journal.txt 文件)。
我认为这可能与 Windows 的 UAC(我在网上搜索时发现的)有关,但禁用 UAC 并以管理权限运行该程序没有帮助。
我不知道现在该怎么办。谁能帮帮我?
谢谢
乔里斯
附加信息:我使用的是 Windows 7 + Visual Studio 2010
编辑: 原来这确实和访问权限有关。也就是说,自 Windows Vista 起,日志 Hook (WH_JOURNALRECORD) 出于安全原因被禁用(另请参阅 this website )。最后,我们使用完全不同的方法在我们的应用程序中提供类似的功能(我不会在这里详细介绍,因为我在问这个问题 1.5 年后编辑这个问题,我不记得所有的我们解决方案的详细信息)。
最佳答案
WH_JOURNALRECORD 与其他的不同。您不需要将它放入 DLL 中,但您确实需要在您的应用程序中有一个消息循环,以便可以调用处理程序(在您的应用程序的上下文中)。我前段时间在另一个网站上发布了一个示例:http://forum.4programmers.net/viewtopic.php?p=557297#id557297 ,钩子(Hook)在示例中捕获 WM_MOUSEMOVE 并将结果打印到控制台。
这种钩子(Hook)很昂贵,因为每次调用回调时,执行上下文都必须切换到您的应用程序。
关于c++ - Windows 中的 WH_JOURNALRECORD Hook (C++) - 从未调用过回调。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3157212/