ToUnicodeEx 不打印"Greater Than"
ToUnicodeEx not printing "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的好组合是什么,以获得">"显示?
问题是shift
和caps lock
在键盘上没有相同的效果。例如,(在英国键盘上)按下shift+1
= !
,但按下1
并带大写锁定仍然会得到1
。
你的代码目前对待它们是一样的,但是,它在两种情况下都使用VK_CAPITAL
。这将给你相同的效果,如果大写锁定打开,这不是你想要的在这种情况下。
因此,解决方案是打破你的逻辑,当你真的想要shift被按下时使用VK_SHIFT
,当你想要caps lock被激活时使用VK_CAPITAL
。
相关文章:
- 替换 std::greater 和其他
- D-lang being faster than C++?
- C++:为什么 std::greater<T>() 包含在 iostream 中?
- MATLAB faster than LAPACK?
- std::greater 在 std::p riority_queue 中的行为是什么?
- "How to use long long data-type rather than pointers data-type to modify other variables ?"
- 如何实现随机访问迭代器的"less than operator"?
- 如何在 C++ 类中重载 'less than' 运算符以比较常量?
- 为什么我收到错误:"there is more than one default constructor"?
- std::tuple faster than std::array?
- 有没有办法通过'greater/lesser than'而不是"="来定义'int'?
- "compares less than 0"是什么意思?
- OpenSSL 错误"data greater than mod len"
- 特征:如何将"greater than"的结果(在ArrayXf上)转换为特征向量
- "multiset<int, greater<int> > ms1"和"multiset<int> ms2(greater<int>())"有什么区别
- Is calloc better than malloc?
- 如果 std::greater<>,那么为什么是 std::less(而不是 std::lesser<>)?
- 我怎样才能写得"if not greater than or equal to some value"雄辩?
- 在评估中使用多个'greater-than / less-than'比较器是否合适?
- ToUnicodeEx 不打印"Greater Than"