зацепка для изменения ввода с клавиатуры - PullRequest
2 голосов
/ 03 декабря 2011

Я пытаюсь написать 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 ... Большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...