确定是否应该同时使用shift和caps大写键

时间:2019-04-10 02:41:05

标签: c++ bitwise-operators

我想根据Shift键和Caps-Lock的状态确定一个字母是大写还是小写。例如:如果两个都关闭或都打开,则字母为小写。但是,如果按下shift键并且关闭Caps-Lock,或者如果未按下shift键并且打开Caps-Lock,则字母应为大写。

我尝试仅查看GetKeyState()中的高位来确定是否按下了Shift键,而查看GetKeyState()中的低位来确定是否使用了大写-锁定已切换,但效果并不理想。现在,我只是将数据输出到文本文件中,以查看得到的值。我从hereGetKeyState()获得了信息

这是我用来确定字母大小写的函数:

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”输出。 我不确定为什么会这样,但是任何帮助/解释将不胜感激:)

1 个答案:

答案 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";
                        }
                    }
                }
            }
        }
    }
}