C++ C++;中的标准Windows密钥检测 #包括 #包括 constexpr自动键_向前='w'; constexpr auto KEY_BACKWARD='s'; constexpr自动键_左='a'; constexpr auto KEY
C++;中的标准Windows密钥检测C++ C++;中的标准Windows密钥检测 #包括 #包括 constexpr自动键_向前='w'; constexpr auto KEY_BACKWARD='s'; constexpr自动键_左='a'; constexpr auto KEY,c++,windows,io,user-input,C++,Windows,Io,User Input,C++;中的标准Windows密钥检测 #包括 #包括 constexpr自动键_向前='w'; constexpr auto KEY_BACKWARD='s'; constexpr自动键_左='a'; constexpr auto KEY_RIGHT='d'; constexpr auto KEY_UP='t'; constexpr auto KEY_DOWN='g'; bool updateKey(字符键值、bool*键控制、键事件记录){ if(ker.uChar.Asci
#包括
#包括
constexpr自动键_向前='w';
constexpr auto KEY_BACKWARD='s';
constexpr自动键_左='a';
constexpr auto KEY_RIGHT='d';
constexpr auto KEY_UP='t';
constexpr auto KEY_DOWN='g';
bool updateKey(字符键值、bool*键控制、键事件记录){
if(ker.uChar.AsciiChar==keyValue){
*按键控制=ker.bKeyDown;
std::cout您可能正在观察自动重复。查看KEY\u EVENT\u RECORD::wRepeatCount
中的内容将输出行更改为std::cout似乎此API包含错误。当我运行代码时,它返回'a'的ascihar
=30和dwControlKeyState
=97(实际的'a'值)在密钥处理中也有已知的bug,例如这个。考虑把你的窗口升级到最新版本,然后问MS,当这不起作用的时候。如果我运行exe,那么它工作得很好。但是如果我从PuxS壳中运行它,它会以上面所示的方式失败。这个机器有最新版本的Windows,所以如果它被解决了。这不是问题。我想我可以直接使用exe!谢谢你的帮助!
#include <windows.h>
#include <iostream>
constexpr auto KEY_FORWARD = 'w';
constexpr auto KEY_BACKWARD = 's';
constexpr auto KEY_LEFT = 'a';
constexpr auto KEY_RIGHT = 'd';
constexpr auto KEY_UP = 't';
constexpr auto KEY_DOWN = 'g';
bool updateKey(char keyValue, bool* key_control, KEY_EVENT_RECORD ker){
if (ker.uChar.AsciiChar == keyValue) {
*key_control = ker.bKeyDown;
std::cout << ker.bKeyDown ;
return TRUE;
}
return FALSE;
}
int main()
{
using namespace std;
HANDLE hIn;
HANDLE hOut;
bool _continue = TRUE;
INPUT_RECORD inRec[128];
DWORD numRead;
hIn = GetStdHandle(STD_INPUT_HANDLE);
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
bool left_control,right_control,up_control,down_control,forward_control,backward_control;
left_control = FALSE;
right_control = FALSE;
up_control = FALSE;
down_control = FALSE;
forward_control = FALSE;
backward_control = FALSE;
while (_continue) {
if (!ReadConsoleInput(hIn, inRec, 128, &numRead)) {
continue;
}
for (DWORD i = 0; i < numRead; i++) {
if (inRec[i].EventType != KEY_EVENT) {
continue;
}
if (updateKey(KEY_UP, &up_control, inRec[i].Event.KeyEvent)) continue;
if (updateKey(KEY_DOWN, &down_control, inRec[i].Event.KeyEvent)) continue;
if (updateKey(KEY_LEFT, &left_control, inRec[i].Event.KeyEvent)) continue;
if (updateKey(KEY_RIGHT, &right_control, inRec[i].Event.KeyEvent)) continue;
if (updateKey(KEY_FORWARD, &forward_control, inRec[i].Event.KeyEvent)) continue;
if (updateKey(KEY_BACKWARD, &backward_control, inRec[i].Event.KeyEvent)) continue;
}
}
return 0;
}