2016-09-14 7 views
0

私は、アプリケーションにテキストを書き込むためにユーザのキーボードを処理する関数を書いていました。ToUnicodeExが "Greater Than"を印刷しない

これを行うには、私はToUnicodeEx関数を使用して、キー状態の配列を使用します。 この関数は、可能なすべての入力に対して完璧に機能しています。「SHIFT + <」の組み合わせであると思われる「>」記号は表示できません。代わりに「<」という記号が表示されますSHIFTキーは押されず、押されたことが分かります。

誰かがすでに同じことを経験していて、問題の内容を知っていますか?あなたは以下の私の機能コードを見つけます

void MyFunction(bool bCapsLockDown) 
    { 
     IOClass io = GetMyIOInstance(); 
     HKL layout = GetKeyboardLayout(0); 
     uchar uKeyboardState[256]; 
     WCHAR oBuffer[5] = {}; 

     //Initialization of KeyBoardState 
     for (uint i = 0; i < 256; ++i) 
     { 
      uKeyBoardState[i] = 0; 
     } 

     // Use of my ConsultKeyState to get the status of pressed keys 
     if (ConsultKeyState(VK_SHIFT) || bCapsLockDown) 
     { 
      uKeyboardState[VK_CAPITAL] = 0xff; 
     } 
     if (ConsultKeyState(VK_CONTROL)) 
     { 
      uKeyboardState[VK_CONTROL] = 0xff; 
     } 
     if (ConsultKeyState(VK_MENU)) 
     { 
      uKeyboardState[VK_MENU] = 0xff; 
     } 
     if (ConsultKeyState(VK_RMENU)) 
     { 
      uKeyboardState[VK_MENU] = 0xff; 
      uKeyboardState[VK_CONTROL] = 0xff; 
     } 

     for (uint iVK = 0; iVK < 256; ++iVK) 
     { 
      bool bKeyDown = ConsultKeyState(iVK) != 0; 
      uint iSC = MapVirtualKeyEx(iVK, MAPVK_VK_TO_VSC, layout); 

      bool bKeyAlreadyDown = io.KeysDown[iVK]; 

      io.KeysDown[iVK] = bKeyDown; 

      if (io.KeysDown[iVK] && bKeyAlreadyDown == false) 
      { 
       int iRet = ToUnicodeEx(iVK, iSC, uKeyboardState, (LPWSTR)oBuffer, 4, 0, layout); 
       if(iRet > 0 && (iswgraph((unsigned short) oBuffer[0]) || oBuffer[0] == ' ')) 
        io.AddInputCharacter((unsigned short) oBuffer[0]); 
      } 
     } 
    } 

編集: 要約すると、私の質問は: ">" が表示得るための良い組み合わせVirtualKey + KeyBoardStateでしょうか?

+0

@HansPassant "MAJ"情報は、uKeyBoardState!に含まれています。 ToUnicodeExは、MAJ、ALT、CTRLなどの他のキーが押されているかどうかを知るために使用します。 – realUser404

+0

英語のウェブサイトでフランス語を避けるのがベストです。 GetKeyboardState()は非常に奇妙です。あなた自身のプロセスのバッファリングされたキーボード状態を取得します。そうでなければメッセージループをポンピングしないと更新されません。 GetAsyncKeyState()を使用してこの問題を回避したように見えますが、これは必ずしもポークしようとしているプロセスのキーボードの状態と一致しないため、正しくありません。 UIオートメーションの使用は、このような問題を回避するために常にベストです。 –

+0

Oups、シフトについて申し訳ありません、すぐに編集するつもりです – realUser404

答えて

0

shiftcaps lockは、キーボードに同じ効果がないという問題があります。たとえば、(英国のキーボードで)shift+1 = !を押しても、キャップロックで1を押しても、1と表示されます。

あなたのコードは現在同じものを扱いますが、いずれの場合もVK_CAPITALが使用されています。これにより、キャップロックがオンの場合と同じ効果が得られます。この場合、これはあなたが望むものではありません。

解決策はロジックを分割し、実際にシフトを押したければVK_SHIFTを使用し、キャップロックを有効にする場合はVK_CAPITALを使用することです。

関連する問題