C++(devc++)怎么实时检测输入字符?
现有一个程序while(1)scanf(“%d”,&a);这个程序会一直循环输入我想写另一个函数,在不改变这个函数的情况下检测键盘输入的字符,如果是数字就正常输入,如果是...
现有一个程序
while(1)
scanf(“%d”,&a);
这个程序会一直循环输入
我想写另一个函数,在不改变这个函数的情况下检测键盘输入的字符,如果是数字就正常输入,如果是Esc就直接退出,怎么做到。
类似vb里的键盘输入事件 展开
while(1)
scanf(“%d”,&a);
这个程序会一直循环输入
我想写另一个函数,在不改变这个函数的情况下检测键盘输入的字符,如果是数字就正常输入,如果是Esc就直接退出,怎么做到。
类似vb里的键盘输入事件 展开
2个回答
展开全部
你需要将关闭行缓冲输入模式,然后用ReadConsoleInput直接读缓冲区内容。行缓冲的标准库函数scanf不可能读入Esc,也不可能在按键后立即返回。
HANDLE hwnd = GetStdHandle(STD_INPUT_HANDLE);
DWORD dwMode;
INPUT_RECORD record[128];
DWORD i, iRead;
char keyName[128];
GetConsoleMode(hwnd, &dwMode);
SetConsoleMode(hwnd, dwMode & ~ENABLE_LINE_INPUT);
while (1)
{
WaitForSingleObject(hwnd, INFINITE);
ReadConsoleInput(hwnd, record, 128, &iRead);
for (i = 0; i < iRead; i++)
{
switch(record[i].EventType)
{
case KEY_EVENT:
if (record[i].Event.KeyEvent.bKeyDown)
{
// 16~23位需要为scan code
GetKeyNameTextA(record[i].Event.KeyEvent.wVirtualScanCode << 16, keyName, 128);
printf("You pressed %s\n", keyName);
}
break;
}
}
}
HANDLE hwnd = GetStdHandle(STD_INPUT_HANDLE);
DWORD dwMode;
INPUT_RECORD record[128];
DWORD i, iRead;
char keyName[128];
GetConsoleMode(hwnd, &dwMode);
SetConsoleMode(hwnd, dwMode & ~ENABLE_LINE_INPUT);
while (1)
{
WaitForSingleObject(hwnd, INFINITE);
ReadConsoleInput(hwnd, record, 128, &iRead);
for (i = 0; i < iRead; i++)
{
switch(record[i].EventType)
{
case KEY_EVENT:
if (record[i].Event.KeyEvent.bKeyDown)
{
// 16~23位需要为scan code
GetKeyNameTextA(record[i].Event.KeyEvent.wVirtualScanCode << 16, keyName, 128);
printf("You pressed %s\n", keyName);
}
break;
}
}
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果你不改上面的代码,那就只能用键盘钩子,详细内容自己查一下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询