如何在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
相关产品推荐
相关产品推荐

