【问题标题】:How to remap keyboard key in c++ with LowLevelKeyboardProc?如何使用 LowLevelKeyboardProc 在 C++ 中重新映射键盘键?
【发布时间】:2013-06-29 11:09:34
【问题描述】:

我需要重新映射一些键,例如 Left Alt 但我只是禁用它,因此禁用 Left Alt 的代码如下所示:

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_eventSendMessageA 这样的函数,但什么也没得到。

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

【问题讨论】:

    标签: c++ windows keyboard shortcut remap


    【解决方案1】:

    这是一种将 Alt 重新映射到 Ctrl 的方法效果很好。不要忘记默认参数 如果您没有定义 wParam 则切换回 alt 可能只是我的电脑好尝试一下

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2020-09-18
      • 2010-12-15
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多