0
#include <curses.h>
#include "SourceFiles/generalFunc.h"

int main(){

    initscr();
    cbreak();
    noecho();
    wtimeout(stdscr,0); //NON-BLOCKING IO. getch returns ERR if no input is read.

    int x = 0;
    sleepMilli(3000); //three seconds
    while((x = wgetch(stdscr)) != ERR){
        x = wgetch(stdscr);
        //flushinp();
        waddch(stdscr,x);
        wrefresh(stdscr);
    }

    waddstr(stdscr, " THAT'S ALL FOLKS!");
    wrefresh(stdscr);
    sleepMilli(2000);
    endwin();


}

sleepMilli是一个等待多少毫秒的函数。

我正在编写一个程序,它检测一个按键,做一些工作,等待一段时间t,然后检测另一个按键并做一些工作,等等。当然,如果t很大并且用户按住了一个键,则该键会在输入缓冲区中重复,因此当用户放开该键时,程序将继续处理该输入缓冲区,直到完成重复的键输入. 这看起来很奇怪,特别是如果那个重复的键移动终端光标(它会在用户放开之后很长时间继续移动)。

我需要一种方法来从按住的键中读取一个输入,然后丢弃其余的。我以为flushinp()这样,但我意识到我错了。在上面的程序中,如果flushinp()被注释掉,那么输入例如:

cvcvcvcvcvcvcv

(所以我没有按住键)输出是:

cvcvcvcvcvcvcv

如果我按住键c,那么输出是:

cccccccccccccc

如果我取消注释flushinp()并执行相同的两个输入,则输出为:

c

cccccccccccccc

因此flushinp()仅适用于单次按键,但不适用于重复的按键事件。是否有可能(在 64 位 Windows 上)只从按住的键中读取一个输入并丢弃其余的?我不想完全关闭重复键,因为显然我希望用户能够通过按住一个键来连续移动光标。

4

0 回答 0