2013-07-02 1 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); 
} 

어떻게 Ctrl 키 왼쪽으로 왼쪽 Alt 키를 매핑하는?

답변

6

이것은 다시 매핑하는 방법입니다. Alt에서 까지 Ctrl이 효과적입니다. 기본 매개 변수 을 잊지 말고 다시 정의하십시오. 정의하지 않으면 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; 
} 
관련 문제