2013-07-02 167 views
3

我需要重新映射某些鍵像左Alt鍵,但我只是禁用它禁止左Alt鍵這個樣子的所以代碼:如何用LowLevelKeyboardProc重新映射C++中的鍵盤鍵?

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HC_ACTION) 
    { 
     KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam; 
     if (p->vkCode == VK_LMENU) return 1;    
    } 
    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

所以我嘗試重新映射左Alt鍵到左Ctrl並使用像「keybd_event」和「SendMessageA」的功能,但沒有得到任何東西。

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HC_ACTION) 
    { 
     KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam; 
     if (p->vkCode == VK_LMENU) 
     { 
      keybd_event(VK_CONTROL, 0, 0, 0); 
      // or use this is sameSendMessageA(0, WM_KEYUP, VK_CONTROL, 0); 
     } 
    } 
    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

如何重新映射左Alt鍵到左按Ctrl

回答

6

這是一種重新映射的方法替代Ctrl很好用。不要忘記默認參數 切換回ALT如果你不定義wParam可能只是我的電腦好試試

include iostream 
include windows.h 

using namespace std; 

HHOOK hHook = 0; 

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HC_ACTION) 
    { 
     KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam; 
     if (p->vkCode == VK_LMENU) // VK_LMENU = ALT key 
     { 
      switch (wParam){ 

      case WM_SYSKEYDOWN :{ // use SYSKEYDOWN 
       cout << "Key down" << endl; 

       keybd_event(VK_LCONTROL, 0x1D, KEYEVENTF_EXTENDEDKEY | 0, 0); 
      break; 
      } 
      case WM_KEYUP: // use regular keyup 
      { 
       cout << "Key up" << endl; 

       keybd_event(VK_LCONTROL, 0x1D, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); 
       return 1; 

      break; 
      } 
      default: 
       wParam = WM_SYSKEYDOWN; // if you do not specify it changes back to alt 
       break; 
      } 
      return 1; 
     } 
    } 
    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) 
{ 

    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, &LowLevelKeyboardProc, hThisInstance, NULL); 
    if (hHook == NULL) 
    { 
     cout << "Error" << endl; 
     return 1; 
    } 

    MSG messages; 

    while (GetMessage (&messages, NULL, 0, 0)) 
    { 
     TranslateMessage(&messages); 
     DispatchMessage(&messages); 
    } 

    return messages.wParam; 
}