Использование звукового сигнала при нажатии клавиш C ++ - PullRequest
0 голосов
/ 13 января 2019

Итак, я хочу помочь другу с проектом, и ему нужно что-то, чтобы издавать звук при каждом нажатии клавиши. Он читает данные как целочисленные значения, используя 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 голосов
/ 14 января 2019

PeekConsoleInput можно использовать для просмотра stdin из другого потока. Вы, вероятно, пропустите некоторые события, потому что нет синхронизации с вашим основным потоком. Это следует рассматривать как взлом, но может работать достаточно хорошо для ваших нужд.

Если вы хотите отказаться от API C / C ++ stdin, вы можете прочитать низкоуровневые события ввода с консоли Win32 с помощью ReadConsoleInput или ввод текста с помощью ReadFile или ReadConsole.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...