2014-02-21 2 views
0

Я могу использовать функцию SetWindowsHookEx для подключения пользовательского KeyboardProc. В подключенной процедуре я могу вернуть 1, чтобы заблокировать входной сигнал клавиатуры от приложения, однако то, что я пытаюсь сделать, это на самом деле изменить данные. Например. пользователь нажимает клавишу A, и я бы хотел заменить его клавишей B.Как изменить ключи в процедуре подключения KeyboardProc?

Но любые изменения, которые я вношу в аргументы WPARAM и LPARAM, как представляется, не имеют никакого эффекта в приложении, он все равно получит исходные ключи. Например. чтобы показать немного псевдокод:

LRESULT KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    memset(&wParam, 0, sizeof(WPARAM)); 
    memset(&lParam, 0, sizeof(LPARAM)); 

    // call the next procedure 
    return CallNextHookEx(keyHook, nCode, wParam, lParam); 
} 

Независимо от того, какие изменения я делаю двум параметрам он не будет иметь эффект, когда приложение считывает WM_KEYDOWN сообщение будет получать оригинальные ключи, как они были поражены.

Можно ли каким-либо образом внести изменения в ключи?

+0

Вы sureley изменяете paramse неправильный путь. Взгляните, какие биты актуальны. http://msdn.microsoft.com/en-us/library/windows/desktop/ms644984(v=vs.85).aspx – icbytes

ответ

0

Решение состоит в том, чтобы использовать SendInput, но только тогда, когда lParam - который должен быть типа приведен к KBDLLHOOKSTRUCT*) - имеет LLKHF_INJECTED флаг в поле его flags.

Вот некоторые D language код копируется из одного из моих проектов:

extern(Windows) 
LRESULT LowLevelKeyboardProc(int code, WPARAM wParam, LPARAM lParam) 
{ 
    auto kbs = cast(KBDLLHOOKSTRUCT*)lParam; 

    // generate a new key event only if this key event was user-generated. 
    if (!(kbs.flags & LLKHF_INJECTED)) 
    { 
     // Alt == toggle key binding 
     if (kbs.flags & LLKHF_ALTDOWN) 
      useKeyMap ^= 1; 

     if (!useKeyMap) 
      return CallNextHookEx(keyHook_LL, code, wParam, lParam); 

     INPUT input; 
     input.type = INPUT_KEYBOARD; 
     input.ki.dwFlags = (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) ? 0 : KEYEVENTF_KEYUP; 

     // replace the key, must be in range 1 to 254 
     input.ki.wVk = keyMap.get(cast(Key)kbs.vkCode, cast(Key)kbs.vkCode); 

     SendInput(1, &input, INPUT.sizeof); 
     return -1; 
    } 

    return CallNextHookEx(keyHook_LL, code, wParam, lParam); 
} 
Смежные вопросы