【发布时间】:2010-07-01 11:14:08
【问题描述】:
在过去的几个小时里,以下代码一直给我带来一些麻烦。 我正在尝试编写一个小程序(基于网络上的一些教程),它使用 WH_JOURNALRECORD 窗口挂钩来记录击键。
主要代码:
#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;
}
DLL 代码:
#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;
}
由于某种原因,键盘挂钩 (SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc,..)) 有效(创建了 'keyboard.txt' 文件),但日志挂钩 (SetWindowsHookEx(WH_JOURNALRECORD, journalRecordProc,...))没有。也就是说,日志挂钩的回调永远不会被调用(journal.txt 文件永远不会被创建)。
我认为这可能与 Windows 的 UAC(我在搜索网络时发现)有关,但禁用 UAC 并以管理权限运行程序并没有帮助。
我不知道现在该做什么。谁能帮帮我?
谢谢
乔里斯
附加信息:我使用的是 Windows 7 + Visual Studio 2010
编辑: 原来这确实和访问权限有关。也就是说,从 Windows Vista 开始,出于安全原因,日志挂钩 (WH_JOURNALRECORD) 被禁用(另请参阅 this website)。最后,我们使用了一种完全不同的方法在我们的应用程序中提供类似的功能(我不会在这里详细介绍,因为我在问这个问题 1.5 年后正在编辑这个问题,我不记得所有的我们解决方案的详细信息)。
【问题讨论】: