1

この 107 タッチのキーボードhttp://www.mobilitylab.eu/mini-design-touch-silver.htmlを購入しました。キーパッドを左手に付けたいと思っています。ただし、キーパッドの numlock を有効にすると、キーボードの numlock が有効になります。したがって、uiop の代わりに 456- があります。このプログラムを見つけましたが、64 ビット OS では動作しません。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.
}
4

2 に答える 2

0

キーボード入力は、単なるWindowsメッセージ以上のものです。メッセージの変更は場合によっては機能しますが、非常に不完全な解決策です。また、ドライバーの状態、、なども考慮する必要がありGetKeyboardStateます。

キーボードのキーを再マップする場合は、新しいキーボードレイアウトを作成して、ロケールに割り当てることができます。

キーボードレイアウトがニーズを満たさない場合は、キーボードデバイスドライバーを作成する必要があります。

特定のアプリケーション(グローバルなシステムではない)でのみこの機能が必要な場合は、幸運なことにWindowsメッセージのみを変更できる可能性があります。

于 2012-09-17T08:25:28.677 に答える
0

理解できません...
キーボードが2つありますか?
はいの場合は、Raw Input (USB HID デバイスからの生データ)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645543(v=vs.85).aspxを使用してみてください

Lparam と wparam は、他のアプリケーションからは見えません。

于 2012-09-17T08:08:21.403 に答える