敲击声在击键C++中的应用
所以我想帮助一个朋友做一个项目,他需要一些东西在每次击键时发出声音。他使用std::cin将数据读取为整数值,我想知道是否有可能生成一个函数,该函数不会使用多线程或以某种方式重载istream>>操作符来修改其项目的其余部分,因此每次按键时都会发出嘟嘟声。 我尝试过这个,我知道过载概念可能是坏的,我可能不理解多线程的工作原理,但是你能推荐一些文章,这样我就可以学习解决这个问题吗?也许C++中的事件处理,但是我没有发现任何一般的东西,只是游戏框架中的事件处理。也许有一些建议? 这是我的代码借口:敲击声在击键C++中的应用,c++,multithreading,winapi,event-handling,operator-overloading,C++,Multithreading,Winapi,Event Handling,Operator Overloading,所以我想帮助一个朋友做一个项目,他需要一些东西在每次击键时发出声音。他使用std::cin将数据读取为整数值,我想知道是否有可能生成一个函数,该函数不会使用多线程或以某种方式重载istream>>操作符来修改其项目的其余部分,因此每次按键时都会发出嘟嘟声。 我尝试过这个,我知道过载概念可能是坏的,我可能不理解多线程的工作原理,但是你能推荐一些文章,这样我就可以学习解决这个问题吗?也许C++中的事件处理,但是我没有发现任何一般的东西,只是游戏框架中的事件处理。也许有一些建议? 这是我的代码借口:
#include <iostream>
#include <thread>
#include <string>
#include <conio.h>
#include <windows.h>
using namespace std;
//compile error very bad
istream& operator>>(istream& in, int& n)
{
int i=0;
char c;
string nr;
nr.resize(30);
do{
c = getch();
if(c >= '0' && c<= '9' && i < 30)
{
cout<<c;
Beep(1000, 10);
nr[i++] = c;
}
if(c == '\b')
{
i--;
cout<<"\b \b";
}
}while(int(c) != 13);
//maybe like this and return void?
n = stoi(nr);
//or like this? even tho makes no sense to me that it would work?
return in>>stoi(nr);
}
void playBeep()
{
while(getch())
{
Beep(1000, 10);
}
}
int main()
{
//maybe this?
thred t(playBeep);
t.join();
//or this with the operator overload somehow?
int arr[10];
for(int i=0; i<10;i++)
cin>>arr[i];
return 0;
}
可用于从另一个线程窥视stdin。您可能会错过一些事件,因为没有与主线程同步。这应该被视为一种黑客行为,但可能足以满足您的需要
如果您愿意放弃C/C++标准API,那么您可以使用ReadConsoleInput读取低级Win32控制台输入事件,或者使用ReadFile或ReadConsole读取文本输入。该程序是否打算作为控制台应用程序运行?Windows不会向控制台应用程序通知击键事件。如果您想让程序收到每个按键的通知,那么您必须编写某种GUI应用程序。@SolomonSlow是的,它打算在控制台上运行,所以我唯一的选择是用一些定制的函数替换所有cin>>数据?@Willneeh是,你必须在非阻塞模式下阅读。我对Windows编程不是很有经验,但我认为没有那么简单。我没有很多为Windows开发的经验,但如果我是你的话,我会寻找一些GUI框架,它有一个模拟Windows控制台的小部件,然后我会寻找一种方法,将按键处理程序挂接到这个小部件上,让你的程序收到击键通知,但在不妨碍小部件以自己的方式处理它们的情况下,@bruno的方式可能更简单,我没有想到这一点。但是,如果你按照他的方式做,你就必须编写自己的行编辑器。