You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PDCurses中设置按键重复延迟为0,使getch()无延迟重复返回?

在PDCurses中消除按键重复延迟,实现按住按键时getch()无延迟连续返回字符

要实现按住按键时getch()每帧无延迟返回对应字符,你可以根据所用PDCurses版本选择以下两种方案:

方法一:使用set_keyboard_delay()函数(推荐,适用于支持该函数的版本)

PDCurses内置的set_keyboard_delay()函数可直接控制按键重复的初始延迟和速率,将初始延迟设为0即可消除按住按键后的等待时间:

#include <curses.h>

int main() {
    initscr();
    cbreak();          // 禁用行缓冲,让getch()立即获取输入
    noecho();          // 禁用输入回显(可选,按需调整)
    keypad(stdscr, TRUE);  // 启用特殊按键识别(如方向键、功能键)
    
    // 设置按键重复初始延迟为0,按住后立即开始连续返回字符
    set_keyboard_delay(0);

    int ch;
    while((ch = getch()) != 'q') {  // 按q键退出循环
        // 处理按键逻辑,示例为打印按下的字符
        printw("Pressed: %c\n", ch);
        refresh();
    }

    endwin();
    return 0;
}

set_keyboard_delay()的参数单位为毫秒,设为0表示无初始延迟,按住按键后getch()会持续返回对应字符,无任何等待。

方法二:非阻塞模式配合循环(兼容所有PDCurses版本)

如果你的PDCurses版本不支持set_keyboard_delay(),可以通过非阻塞输入模式实现等效效果:

#include <curses.h>

int main() {
    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);
    nodelay(stdscr, TRUE);  // 设置窗口为非阻塞模式,getch()立即返回ERR或字符

    int ch;
    while(1) {
        ch = getch();
        if(ch == 'q') break;  // 按q键退出
        if(ch != ERR) {       // 检测到有效按键时处理
            printw("Pressed: %c\n", ch);
            refresh();
        }
        // 可在此添加帧控制逻辑,如sleep(10)限制帧率
    }

    endwin();
    return 0;
}

非阻塞模式下getch()不会等待输入,每帧都会返回当前按下的字符(若有),从而实现按住按键时无延迟连续响应。

注意:确保系统层面的按键重复功能处于启用状态(通常为默认设置),否则无法实现连续返回效果。

内容的提问来源于stack exchange,提问作者Loch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:15:34