ToUnicodeEx不打印“大于”

时间:2016-09-14 12:57:18

标签: c++ windows input unicode keyboard

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

为了做到这一点,我使用 ToUnicodeEx 函数,该函数使用一组Key状态。 该功能对于每个可能的输入都非常好,除了一个:我无法显示“>”符号,应该是“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] );
            }
        }
    }

修改: 总结一下,我的问题是: 获得“&gt;”的VirtualKey + KeyBoardState的良好组合是什么?显示?

1 个答案:

答案 0 :(得分:0)

问题是shiftcaps lock对键盘的影响不同。例如,(在英国键盘上)按shift+1 = !,但按下大写锁定的1仍会给您1

但是,您的代码目前对它们的处理方式相同,并且在两种情况下都使用VK_CAPITAL。这将为您提供与大写锁定打开时相同的效果,在这种情况下,这不是您想要的。

因此,解决方案是打破您的逻辑并在您真正想要按下切换时使用VK_SHIFT,并在希望大写锁定处于活动状态时使用VK_CAPITAL