我想根据Shift键和Caps-Lock的状态确定一个字母是大写还是小写。例如:如果两个都关闭或都打开,则字母为小写。但是,如果按下shift键并且关闭Caps-Lock,或者如果未按下shift键并且打开Caps-Lock,则字母应为大写。
我尝试仅查看GetKeyState()
中的高位来确定是否按下了Shift键,而查看GetKeyState()
中的低位来确定是否使用了大写-锁定已切换,但效果并不理想。现在,我只是将数据输出到文本文件中,以查看得到的值。我从here的GetKeyState()
获得了信息
这是我用来确定字母大小写的函数:
bool Capitalize(short int shift, short int caps){
bool s = shift<0;
bool c = (caps&1)!=0;
return s!=c;
}
这是我调用函数的地方:
ofstream write("test.txt", ios::app);
void main(){
char c;
for(;;){
for(c=1;c<=222;c++){
if(GetAsyncKeyState(c)==-32767){
short int shift = GetKeyState(VK_SHIFT);
short int caps = GetKeyState(VK_CAPITAL);
switch(c){
case 65:{
if(Capitalize(shift,caps))
write<<"A";
else
write<<"a";
}break;
}
write<<"\r\n";
}
}
}
}
因此,当我关闭Caps-Lock并且不按住Shift键时,输出如下:
A
a
a
a
如果您注意到,第一个字母是大写字母,我希望它是小写字母。 当我在Caps-Lock开启的情况下按住Shift时会发生同样的事情,这会产生小写字母。如果按住任一档或打开Caps-Lock(但没有同时打开),则它似乎可以正常工作,并且所有字母都以大写字母“ A”输出。 我不确定为什么会这样,但是任何帮助/解释将不胜感激:)
答案 0 :(得分:0)
对于您期望的输出,此代码对我而言效果很好:
#include <Windows.h>
#include <iostream>
bool Capitalize(short int shift, short int caps)
{
bool s = shift < 0;
bool c = (caps & 1) != 0;
return s != c;
}
void main()
{
unsigned char c;
while (true)
{
for (c = 1; c <= 222; c++)
{
if (GetAsyncKeyState(c) &1)
{
short int shift = GetKeyState(VK_SHIFT);
short int caps = GetKeyState(VK_CAPITAL);
switch (c)
{
case 65:
{
if (Capitalize(shift, caps))
{
std::cout << "A\n";
}
else
{
std::cout << "a\n";
}
}
}
}
}
}
}