敲击声在击键C++中的应用

敲击声在击键C++中的应用,c++,multithreading,winapi,event-handling,operator-overloading,C++,Multithreading,Winapi,Event Handling,Operator Overloading,所以我想帮助一个朋友做一个项目,他需要一些东西在每次击键时发出声音。他使用std::cin将数据读取为整数值,我想知道是否有可能生成一个函数,该函数不会使用多线程或以某种方式重载istream>>操作符来修改其项目的其余部分,因此每次按键时都会发出嘟嘟声。 我尝试过这个,我知道过载概念可能是坏的,我可能不理解多线程的工作原理,但是你能推荐一些文章,这样我就可以学习解决这个问题吗?也许C++中的事件处理,但是我没有发现任何一般的东西,只是游戏框架中的事件处理。也许有一些建议? 这是我的代码借口:

所以我想帮助一个朋友做一个项目,他需要一些东西在每次击键时发出声音。他使用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的方式可能更简单,我没有想到这一点。但是,如果你按照他的方式做,你就必须编写自己的行编辑器。