我可以在 main() 函数之外使用 GetAsyncKeyState() 吗?
Can I use GetAsyncKeyState() outside of the main() function?
我正在编写一个响应键盘输入的 win32 应用程序,只是为了获得对编程过程的信心。为此,我使用了 GetAsyncKeyState()
函数。
起初我在 main()
函数中编写了我所有的代码,一切看起来都很好,它工作了。所以我决定让事情复杂化,但这需要我在 main()
调用的另一个函数中使用 GetAsyncKeyState()
函数。我以为我只需要在 main()
之外声明一些变量并将代码从 main
移动到新函数,如下所示:
int btnup_down = 0;
int close = 1;
int main(void){
while (1){
Sleep(50);
listentokb();
if (close == 0){
break;
}
}return 0;
}
int listentokb(void){
if ((GetAsyncKeyState(0x4C) & 0x8000) && (ko == 0)){
ko = 1;
printf("Ok you pressed k");
return 0;
} else if (((GetAsyncKeyState(0x4C) == 0) && (ko == 1)) {
ko = 0;
printf("Now you released it");
close = 0;
return 0;
}return 0;
}
当我 运行 这段代码时,循环继续进行,我是否按下该键并不重要,它一直循环而不打印任何内容。任何帮助将不胜感激。
您的问题与main()
无关。只要提供正确的参数,您就可以在代码中的任何位置调用 GetAsyncKeyState()
等 winapi 函数。
根据 virtual key codes 的列表,代码 0x4c 对应于键 L 而不是键 K。因此,在您的代码中的括号更正拼写错误之后,我可以 运行 它成功地中断了 L
的循环
关于你的函数的一些评论:
你的函数listentokb()
总是returns 0。另一方面,你使用全局变量close
告诉调用函数你键盘扫描的结果。这是一个非常糟糕的做法:尽可能避免使用全局变量。
这里是你的代码的一个稍微更新的版本,它禁止全局变量,并使用 return 值来传达结果:
const int KEY_K = 0x4B; // avoid using values directly in the code
int listentokb (void){ // returns 'K' if K is released and 0 otherwise
static int ko; // this is like a global variable: it will keep the value from one call to the other
// but it has teh advantage of being seen only by your function
if((GetAsyncKeyState(KEY_K) & 0x8000) && (ko == 0)){
ko = 1;
printf("Ok you pressed k");
return 0;
}
else if((GetAsyncKeyState(KEY_K) == 0) && (ko == 1)) {
ko = 0;
printf("Now you released it");
return 'K';
}
return 0;
}
int main(void){
bool go_on = true; // The state of the loop shall be local variable not global
while(go_on){
Sleep(50);
go_on= ! listentokb(); // if returns 0 we go on
}
return 0;
}
我正在编写一个响应键盘输入的 win32 应用程序,只是为了获得对编程过程的信心。为此,我使用了 GetAsyncKeyState()
函数。
起初我在 main()
函数中编写了我所有的代码,一切看起来都很好,它工作了。所以我决定让事情复杂化,但这需要我在 main()
调用的另一个函数中使用 GetAsyncKeyState()
函数。我以为我只需要在 main()
之外声明一些变量并将代码从 main
移动到新函数,如下所示:
int btnup_down = 0;
int close = 1;
int main(void){
while (1){
Sleep(50);
listentokb();
if (close == 0){
break;
}
}return 0;
}
int listentokb(void){
if ((GetAsyncKeyState(0x4C) & 0x8000) && (ko == 0)){
ko = 1;
printf("Ok you pressed k");
return 0;
} else if (((GetAsyncKeyState(0x4C) == 0) && (ko == 1)) {
ko = 0;
printf("Now you released it");
close = 0;
return 0;
}return 0;
}
当我 运行 这段代码时,循环继续进行,我是否按下该键并不重要,它一直循环而不打印任何内容。任何帮助将不胜感激。
您的问题与main()
无关。只要提供正确的参数,您就可以在代码中的任何位置调用 GetAsyncKeyState()
等 winapi 函数。
根据 virtual key codes 的列表,代码 0x4c 对应于键 L 而不是键 K。因此,在您的代码中的括号更正拼写错误之后,我可以 运行 它成功地中断了 L
的循环关于你的函数的一些评论:
你的函数listentokb()
总是returns 0。另一方面,你使用全局变量close
告诉调用函数你键盘扫描的结果。这是一个非常糟糕的做法:尽可能避免使用全局变量。
这里是你的代码的一个稍微更新的版本,它禁止全局变量,并使用 return 值来传达结果:
const int KEY_K = 0x4B; // avoid using values directly in the code
int listentokb (void){ // returns 'K' if K is released and 0 otherwise
static int ko; // this is like a global variable: it will keep the value from one call to the other
// but it has teh advantage of being seen only by your function
if((GetAsyncKeyState(KEY_K) & 0x8000) && (ko == 0)){
ko = 1;
printf("Ok you pressed k");
return 0;
}
else if((GetAsyncKeyState(KEY_K) == 0) && (ko == 1)) {
ko = 0;
printf("Now you released it");
return 'K';
}
return 0;
}
int main(void){
bool go_on = true; // The state of the loop shall be local variable not global
while(go_on){
Sleep(50);
go_on= ! listentokb(); // if returns 0 we go on
}
return 0;
}