挂钩键盘更改键码

时间:2012-03-30 12:06:49

标签: c++ winapi keycode keyboard-hook keypad

我买了107触摸的键盘http://www.mobilitylab.eu/mini-design-touch-silver.html, 我想要一个键盘放在我的左手上。 但是当我们激活键盘的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 :(得分:0)

无法理解你...
你有2个键盘吗?如果是,尝试使用原始输入(来自USB HID设备的原始数据)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645543(v=vs.85).aspx

Lparam和wparam在其他应用程序中不可见。

答案 1 :(得分:0)

键盘输入不仅仅是Windows消息。在某些情况下修改消息会起作用,但这是一个非常不完整的解决方案。您还需要考虑驱动程序状态GetKeyboardState和其他。

如果要重新映射键盘上的键,可以创建新的键盘布局并将其指定给区域设置。

如果键盘布局不能满足您的需求,则需要编写键盘设备驱动程序。

如果您只需要在特定应用程序(而不是全局系统)中使用此功能,那么您可能会很幸运并且只能修改Windows消息。