Следующий код доставлял мне некоторые проблемы в течение последних нескольких часов. Я пытаюсь написать небольшую программу (на основе некоторых руководств из Интернета), которая использует обработчик Windows 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 никогда не создается).
Я думаю, что это может иметь какое-то отношение к UAC Windows (который я обнаружил при поиске в Интернете), но отключение UAC и запуск программы с правами администратора не помогли.
Я не знаю, что мне теперь делать. Может кто-нибудь помочь мне?
Спасибо
Джорис
Дополнительная информация: я использую Windows 7 + Visual Studio 2010
Изменить: оказалось, что это действительно связано с правами доступа. То есть, начиная с Windows Vista, обработчики журнала (WH_JOURNALRECORD) отключены по соображениям безопасности (см. Также этот сайт). В конце концов, мы использовали совершенно другой подход для обеспечения аналогичной функциональности в нашем приложении (я не буду вдаваться в подробности здесь, так как я редактирую этот вопрос через 1,5 года после того, как я задал этот вопрос, и я не помню всех детали нашего решения).