Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;从虚拟密钥从A到Z_C++ - Fatal编程技术网

C++ C++;从虚拟密钥从A到Z

C++ C++;从虚拟密钥从A到Z,c++,C++,比这个更简单的代码 根据微软的说法,有一些常数只是增加数字(例如0x41是a,旁边是b,是0x42),但有一些不是(例如0x49是I,但旁边是0x4A,是J) 如何使用该模式简化此代码?当然,我不想写所有这些来自A-Z的角色 bool CharIsPressed(int getKey) { switch (getKey) { case 0x41: if (GetAsyncKeyState(VK_SHIFT)) WriteKey("A

比这个更简单的代码

根据微软的说法,有一些常数只是增加数字(例如0x41是a,旁边是b,是0x42),但有一些不是(例如0x49是I,但旁边是0x4A,是J)

如何使用该模式简化此代码?当然,我不想写所有这些来自A-Z的角色

bool CharIsPressed(int getKey)
{
    switch (getKey)
    {
    case 0x41:
        if (GetAsyncKeyState(VK_SHIFT))
            WriteKey("A");
        else
            WriteKey("a");
        break;
    case 0x42:
        if (GetAsyncKeyState(VK_SHIFT))
            WriteKey("B");
        else
            WriteKey("b");
        break;
    case 0x43:
        if (GetAsyncKeyState(VK_SHIFT))
            WriteKey("C");
        else
            WriteKey("c");
        break;
    case 0x44:
        if (GetAsyncKeyState(VK_SHIFT))
            WriteKey("D");
        else
            WriteKey("d");
        break;
    case 0x45:
        if (GetAsyncKeyState(VK_SHIFT))
            WriteKey("E");
        else
            WriteKey("e");
        break;
    default: return FALSE;
    }
}
注意:
WriteKey()
函数要求的是
LPCSTR
,而不是
string


注:
getkey
来自
char键
返回ASCII码

字母的虚拟键码与大写字母的ASCII码相同。我不明白你在I/J示例中的意思,0x4a=0x49+1

您的代码可以这样简化

bool CharIsPressed(int getKey)
{
    char buf[2]=" ";
    if('A'<=getKey && getKey<='Z') {
        if(GetAsyncKeyState(VK_SHIFT) & 0x8000) buf[0]=getKey;
        else buf[0]=getKey+('a'-'A');
        WriteKey(buf);
        return true;
    }
    return false;
}
bool CharIsPressed(int-getKey)
{
char buf[2]=“”;

如果('A'函数中得到的整数值
int getKey
实际上是ASCII格式字符的十六进制值

因此,您可以看到键码等于ASCII表中大写字母的值(如果按下shift键)。如果未按下shift键,则可以向键码添加0x20的偏移量,以获得ASCII码中的等价小写字母

因此,由于字母的值相同,我假设您可以轻松地将密钥码转换为具有以下内容的字符:

bool CharIsPressed(int getKey)
{
    char letter = getKey;
    char my_lpcstr[2] = {'x', '\0'};

    // Check if the input is no letter
    if((getKey < 'A') || (getKey > 'Z'))
        return false;

    if(!GetAsyncKeyState(VK_SHIFT)){
        letter += 0x20;
    }
    // Do a LPCSTR out of the char
    my_lpcstr[0] = letter;
    WriteKey(my_lpcstr);

    return true;
}
bool CharIsPressed(int-getKey)
{
char字母=getKey;
char my_lpcstr[2]={'x','\0'};
//检查输入是否为无字母
if((getKey<'A')| |(getKey>'Z'))
返回false;
如果(!GetAsyncKeyState(VK_SHIFT)){
字母+=0x20;
}
//从字符中执行LPCSTR
我的字母[0]=字母;
WriteKey(我的电脑);
返回true;
}

为什么不使用静态
std::map
将虚拟键映射到字母?如果按下shift键,则在打印字符时在字符上使用
std::toupper
。检查字符是否为字母,如果按下shift键,则大写。无需任何
开关。如果字符不是字母,则返回falsE.还是新的C++。同样,需要它,因为我需要像Shift,Enter等输入用户@ KhairoulIkhwan,因为它的价值,开始使用Windows API编程是最坏的事情之一,如果你的目标是学习(好)C++如果你对C++或C++有很好的处理,那么进入Windows API就容易多了,但它仍然不是最容易使用的API。叹息——又是一个新奇的东西,又是一个脚本代码,使用了代码> GATASYNCKEYSTATEON/CODE >来制作键盘记录器。没有奖励奖励原创。<代码> KHaIROUL >代码>这是我在打字后得到的。屏幕上的code>Khairoul
。@KhairoulIkhwan:getKey
从哪里来?因为如果它来自一个
WM\u KEYDOWN
或类似的东西,那么使用
GetAsyncKeyState
是错误的(实际上,使用
GetAsyncKeyState
几乎是不正确的,因为它与输入队列不同步).忘了说,
getKey
来自返回ASCII的
char key;
code@KhairoulIkhwan:此外,您还以错误的方式使用了
GetAsyncKeyState
(我感到很遗憾,因为我在复制/粘贴过程中没有注意到);
GetAsyncKeyState
返回一个
SHORT
,如果当前按下该键,则返回最高有效位集;如果自上次调用
GetAsyncKeyState
以来按下该键,则返回最低有效位集;因此,您必须根据设置了MSB的掩码进行显式检查(参见更新的示例)@KhairoulIkhwan:它来自某个变量的事实并不能说明它实际上来自何处。这个变量是如何初始化的?这个函数是在
WM\u KEYDOWN
key
中调用的吗?它来自
wParam
?还是来自
GetAsyncKeyState
?这个函数没有
返回
,毫无理由n将
my_lpcstr
设置为
x
,有冗余变量
letter
,甚至不检查传入的字符是否是小写字母。事实上,你读过函数名吗?我确实注意到了这段代码,并对其进行了编辑。不太整洁的
x
只是一个随机值,不重要,我知道
letter
是多余的,但我使用它来更好地理解代码,主要问题是如何简化代码,所以你是对的,我不关心返回,但现在我进行了编辑。谢谢。