gpt4 book ai didi

C++ 如何使用 ESC 按钮终止我的程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:10 27 4
gpt4 key购买 nike

这是我使用 visual studio 2012 express 的主要功能,代码运行良好。我的问题是,当用户按下 ESC 按钮而不是 -1 时,我将如何终止此循环。虽然我更喜欢在 unix 和 windows 中都适用的解决方案,但如果不可能的话,我最感兴趣的是它在 windows 上的工作。

int _tmain(int argc, _TCHAR* argv[])
{
list mylist;

int value;
cout<<"Give the numbers you want to insert to the list, press -1 to stop\n";
do
{
cin>>value;
mylist.insertf(value);
mylist.sort_list();
mylist.print();
}while(value!=-1);




}

最佳答案

这是 Windows 的解决方案

第一个解决方案:

当用户开始输入直到按下 enter 时,Esc 将不会被处理。空闲时 Esc 将被处理

#include <Windows.h>
#include <iostream>
#include <conio.h>
#include <vector>
int main(int argc, char **argv)
{
int value=0;
std::vector<int> mylist;
do
{
//check if any input.
if (_kbhit()){
//probable user started to type
//block to read till the user press Enter. If you want to handle Esc here .
//then you should manually do input reading . I will write that solution later
std::cin>>value;
//if success
if(std::cin.good()){
mylist.push_back(value);
}else{
//firstly, clear error flag
std::cin.clear();
//ignore
std::cin.ignore(10000,'\n');

}

//print list
std::cout<<"new list: { " ;
for(int i=0;i< mylist.size();i++){
std::cout<<mylist[i]<<'\t';
}
std::cout<<" }"<<std::endl;
}

//check if Esc Pressed
}while(GetAsyncKeyState(VK_ESCAPE)==0);

return 0;
}

第二种解决方案:

Esc 将始终在另一个线程中处理。在某些情况下可能不希望立即退出

DWORD WINAPI CheckEscape( LPVOID lpParam ) {
while(GetAsyncKeyState(VK_ESCAPE)==0){
//sleep
Sleep(10);
}
exit(0);

}



int main(int argc, char **argv)
{
int value=0;
std::vector<int> mylist;
//create thread for handling ESC key
CreateThread( NULL, 0, CheckEscape,NULL , 0, NULL);

//loop infinitely
while(true)
{
std::cin>>value;
//if success
if(std::cin.good()){
mylist.push_back(value);
}else{
//firstly, clear error flag
std::cin.clear();
//ignore
std::cin.ignore(10000,'\n');

}

//print list
std::cout<<"new list: { " ;
for(int i=0;i< mylist.size();i++){
std::cout<<mylist[i]<<'\t';
}
std::cout<<" }"<<std::endl;
}
return 0;
}

第三种解决方案和最佳解决方案。手动完成所有操作

手动处理按键。按下 Esc 时将调用 Exit。您可以更改它以处理更正确的方式

bool keypress( char &key){
INPUT_RECORD IR[1];
DWORD read;
static HANDLE h = GetStdHandle(STD_INPUT_HANDLE);
while(PeekConsoleInputA(h,IR,1,&read)){
if(read!=0){
//check if it was Key Event
if(IR[0].EventType==KEY_EVENT){
key=IR[0].Event.KeyEvent.uChar.AsciiChar;
ReadConsoleInputA(h,IR,1,&read);
FlushConsoleInputBuffer(h);
return true;
}
if(ReadConsoleInputA(h,IR,1,&read)){
continue;
}
}else{
return false;
}
}
}

//getnumber
int cinnumb( ){
char buffer[32];
buffer[0]='\0';
int count=0;
DWORD key=-1;
while(true){

Sleep(100);
do{
//here I make it nonblockin keypress
//but actually we do not need it
//we can use blocking ReadConsoleInputA(h,IR,1,&read);
//this way we not even need sleep() and
//our keypress function will be simple
//anyway im posting nonblocking one

//nonblocking keypress
char key=0;
bool isOk=keypress(key );

if(!isOk ){
Sleep(20);
continue;
}

if(key>='0' && key<='9'){
buffer[count]=key;
std::cout<<key;
++count;
if( count==31)break;

}

// check Enter key and enough symbol
if( key==13 && count>0 ){
std::cout<<std::endl;
break;
}

//for windows

//check if Esc pressed
if(key==27) exit(0);


}while(true);

buffer[count]='\0';

int value=atoi(buffer);
return value;
}
}
int main(int argc, _TCHAR* argv[])
{
std::vector<int> mylist;
int value;
char buffer[100];
//infinite loop
while(true)
{
//get number
value=cinnumb();
mylist.push_back(value);
//print list
std::cout<<"new list: { " ;
for(int i=0;i< mylist.size();i++){
std::cout<<mylist[i]<<'\t';
}
std::cout<<" }"<<std::endl;
//sleep a little
Sleep(10);
} ;


return 0;

}

关于C++ 如何使用 ESC 按钮终止我的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17174849/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com