Следующий код доставляет мне неприятности в течение последних нескольких часов.Я пытаюсь написать небольшую программу (основанную на некоторых учебниках из Интернета), которая использует хук 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 года после того, как задал этот вопрос, и я не помню вседетали нашего решения).