Я пытаюсь написать DLL, которая перехватывает ввод с клавиатуры и модифицирует коды scan / vkey до того, как значения будут представлены в цикле событий процесса.Упрощенный код dll (сгенерированный VS 2010):
#include "stdafx.h"
#include "hookdll.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
static const char *LogFileName = "c:/tmp/hook_report.txt";
#define LogOpen() \
{\
freopen(LogFileName, "w", stdout); \
}
#define Log(fmt, ...) if ( 1 )\
{\
fprintf(stdout, "%s:%d " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__); \
fflush(stdout); \
}
static HHOOK HookHandle;
char*
DbHookToString(LPARAM lParam)
{
static char tmp[128];
KBDLLHOOKSTRUCT* hs = (KBDLLHOOKSTRUCT*)lParam;
sprintf(tmp,
"vkCode=0x%02X"
", scanCode=0x%02X"
", flags=0x%08X"
", time=%d"
", dwExtraInfo=0x%08X",
hs->vkCode
, hs->scanCode
, hs->flags
, hs->time
, hs->dwExtraInfo);
return tmp;
}
LRESULT CALLBACK
keyHandler(int nCode, WPARAM wParam, LPARAM lParam)
{
// Checks whether params contain action about keystroke
if(nCode == HC_ACTION)
{
KBDLLHOOKSTRUCT* hs = (KBDLLHOOKSTRUCT*)lParam;
Log("IN: %d: %s", wParam, DbHookToString(lParam));
switch(hs->vkCode)
{
default:
break;
case 0x31:
++hs->vkCode;
++hs->scanCode;
break;
case 0x32:
//--hs->vkCode;
//--hs->scanCode;
break;
}
Log("OUT: %d: %s\n", wParam, DbHookToString(lParam));
}
return CallNextHookEx(HookHandle, nCode, wParam, lParam);
}
BEGIN_MESSAGE_MAP(ChookdllApp, CWinApp)
END_MESSAGE_MAP()
ChookdllApp::ChookdllApp()
{
}
ChookdllApp theApp;
BOOL ChookdllApp::InitInstance()
{
LogOpen();
CWinApp::InitInstance();
if (!AfxSocketInit())
{
Log("AfxSocketInit failed");
return FALSE;
}
HookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0);
if(HookHandle == NULL)
{
Log("SetWindowsHookEx failed");
return FALSE;
}
return TRUE;
}
Код приложения, в виде скелета, представляет собой приложение для формы Windows на C ++, содержащее одно текстовое поле в одной форме;Проблема заключается в том, что вводимые символы, в частности клавиша с цифрой «1», проходят без изменений, даже если DLL сообщает в файле журнала, что она модифицируется.Помогите кому-нибудь?
... hookdll.cpp: 84 IN: 256: vkCode = 0x31, scanCode = 0x02, flags = 0x00000000, время = 11326265, dwExtraInfo = 0x00000000 ... \ hookdll.cpp: 100 OUT: 256: vkCode = 0x32, scanCode = 0x03, flags = 0x00000000, время = 11326265, dwExtraInfo = 0x00000000
... \ hookdll.cpp: 84 IN: 257: vkCode = 0x31, scanCode =0x02, флаги = 0x00000080, время = 11326374, dwExtraInfo = 0x00000000 ... \ hookdll.cpp: 100 OUT: 257: vkCode = 0x32, scanCode = 0x03, флаги = 0x00000080, время = 11326374, dwExtraInfo = 0x90000*
... snip ..
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
HINSTANCE hinstDLL = LoadLibrary("hookdll.dll");
if ( hinstDLL == NULL )
{
volatile int err = GetLastError();
err += 1;
}
}
... snip ... Большое спасибо.