C++ C++;从虚拟密钥从A到Z
比这个更简单的代码 根据微软的说法,有一些常数只是增加数字(例如0x41是a,旁边是b,是0x42),但有一些不是(例如0x49是I,但旁边是0x4A,是J) 如何使用该模式简化此代码?当然,我不想写所有这些来自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
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
是多余的,但我使用它来更好地理解代码,主要问题是如何简化代码,所以你是对的,我不关心返回,但现在我进行了编辑。谢谢。