Hook Keyboard для изменения кода клавиши - PullRequest
1 голос
/ 30 марта 2012

Я купил эту клавиатуру http://www.mobilitylab.eu/mini-design-touch-silver.html из 107 касаний, и я хочу, чтобы клавиатура поместила ее на левую руку.но когда мы активируем numlock на клавиатуре, он активирует numlock на клавиатуре.Таким образом, у нас есть 456 - вместо uiop.Я нашел эту программу, но она не работает на 64-битной ОС.http://www.bellamyjc.org/fr/systeme.html#knumlock.

Так что я хочу сделать свою собственную программу на C ++, но она не работает нормально, ловушка в порядке (WH_GETMESSAGE), но я не понимаю, как мы можем изменить код ключа и какможно узнать, является ли это клавишей клавиатуры или клавиатуры?

Вот мой код, в котором я пытаюсь изменить сообщение:

//-----------------Keyboard Hook Callback---------------//
Hookmsg_API LRESULT CALLBACK Hookmsg(int ncode,WPARAM wparam,LPARAM lparam){
    //if(ncode>=0) //
    if(ncode<0)
        return CallNextHookEx(hook,ncode,wparam,lparam);
    MSG *msg;
    msg=(MSG *)lparam;
    WORD newVK,oldVK;
    WORD newSC,oldSC;

    if(ncode==HC_ACTION)
    {
        if((msg->message == WM_KEYUP))//Check whether key was pressed(not released).)
        { 
            oldVK=msg->wParam;
            oldSC=SCANCODE(msg->lParam);
            bool extendkey=false;
            if(((HIWORD(msg->wParam) & 0x0100) == 0x0100))
            {
                extendkey=true;
            }
            if(!extendkey)
            {
                bool modif=true;
                switch(oldVK)//wparam
                {
                    case VK_INSERT: newVK=VK_NUMPAD0; break;
                    case VK_END: newVK=VK_NUMPAD1; break;
                    case VK_DOWN: newVK=VK_NUMPAD2; break;
                    case VK_NEXT: newVK=VK_NUMPAD3; break;
                    case VK_LEFT: newVK=VK_NUMPAD4; break;
                    case VK_CLEAR: newVK=VK_NUMPAD5; break;
                    case VK_RIGHT: newVK=VK_NUMPAD6; break;
                    case VK_HOME: newVK=VK_NUMPAD7; break;
                    case VK_UP: newVK=VK_NUMPAD8; break;
                    case VK_PRIOR: newVK=VK_NUMPAD9; break;
                    case VK_DELETE: newVK=VK_DECIMAL; break;
                    default: modif=false;
                }
                if(modif==true)
                {

                    msg->wParam = VK_NUMPAD0;
                    UINT newSC=MapVirtualKey(VK_NUMPAD0,MAPVK_VK_TO_VSC);
                    msg->lParam &= 0xFF00;
                    msg->lParam += (newSC << 16 );
                    //MessageBox( NULL, TEXT("OK"), TEXT("Error!"), MB_OK);
                }
            }

        }
    }
    return ( CallNextHookEx(hook,ncode,wparam,lparam) );//pass control to next hook in the hook chain.
}

Ответы [ 2 ]

0 голосов
/ 17 сентября 2012

Ввод с клавиатуры - это гораздо больше, чем просто сообщения Windows. Модификация сообщений в некоторых случаях будет работать, но это далеко не полное решение. Вам также необходимо учитывать состояние драйвера, GetKeyboardState и др.

Если вы хотите переназначить клавиши на клавиатуре, вы можете создать новую раскладку клавиатуры и назначить ее для локали.

Если раскладки клавиатуры не удовлетворяют вашим потребностям, вам нужно написать драйвер устройства клавиатуры.

Если вам нужна эта функциональность только в определенном приложении (а не в глобальном масштабе системы), то вам, возможно, удастся повезти и вы сможете изменить только сообщения Windows.

0 голосов
/ 17 сентября 2012

не могу понять, у вас ...
у вас есть 2 клавиатуры?
, если да, попробуйте использовать необработанный ввод (необработанные данные с устройства USB HID)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645543(v=vs.85).aspx

Lparam иwparam не видны для других приложений.

...