我编写了一个处理用户键盘的函数,以便在应用程序中编写文本。
为了做到这一点,我使用 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的良好组合是什么?显示?
答案 0 :(得分:0)
问题是shift
和caps lock
对键盘的影响不同。例如,(在英国键盘上)按shift+1
= !
,但按下大写锁定的1
仍会给您1
。
但是,您的代码目前对它们的处理方式相同,并且在两种情况下都使用VK_CAPITAL
。这将为您提供与大写锁定打开时相同的效果,在这种情况下,这不是您想要的。
因此,解决方案是打破您的逻辑并在您真正想要按下切换时使用VK_SHIFT
,并在希望大写锁定处于活动状态时使用VK_CAPITAL
。