在按键C ++上使用蜂鸣声

时间:2019-01-13 16:53:20

标签: 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;
}

1 个答案:

答案 0 :(得分:0)

PeekConsoleInput可用于从另一个线程窥视标准输入。您可能会错过一些事件,因为与主线程没有同步。应该将其视为一种hack,但可能足以满足您的需求。

如果您愿意放弃C / C ++ stdin API,则可以使用ReadConsoleInput读取低级Win32控制台输入事件,或者使用ReadFileReadConsole读取文本输入。