ToUnicodeEx 不打印"Greater Than"

ToUnicodeEx not printing "Greater Than"

本文关键字:Greater Than 打印 ToUnicodeEx      更新时间:2023-10-16

我编写了一个函数来处理用户键盘以便在应用程序中编写文本。

为了做到这一点,我使用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的好组合是什么,以获得">"显示?

问题是shiftcaps lock在键盘上没有相同的效果。例如,(在英国键盘上)按下shift+1 = !,但按下1并带大写锁定仍然会得到1

你的代码目前对待它们是一样的,但是,它在两种情况下都使用VK_CAPITAL。这将给你相同的效果,如果大写锁定打开,这不是你想要的在这种情况下。

因此,解决方案是打破你的逻辑,当你真的想要shift被按下时使用VK_SHIFT,当你想要caps lock被激活时使用VK_CAPITAL