You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何向自制响应键盘输入的控制台菜单程序传递键盘输入模拟?

如何模拟键盘输入到你的控制台菜单程序

嘿,我瞅了你的控制台菜单代码,要给它模拟键盘输入其实有几种实用的路子,我给你挨个唠清楚:

方法1:文件重定向输入(最省心的快速方案)

你的程序用了getchar()读取键盘输入,而getchar()默认是从标准输入流(stdin)读数据的。那我们可以把模拟的输入提前写到文本文件里,然后让程序从这个文件里读,就跟用户手动敲键盘一样。

步骤很简单:

  • 新建一个文本文件,比如叫mock_input.txt,里面写你要模拟的按键,比如想选第一个选项再退出,就写:
    1
    q
    
  • 编译你的菜单程序(假设生成的可执行文件叫menu_app),然后在终端里运行:
    ./menu_app < mock_input.txt
    
    这样程序就会自动读取文件里的内容,完全模拟手动输入的效果。

方法2:修改代码替换输入源(适合调试阶段)

如果不想用外部文件,直接在代码里改,把getchar()换成我们自己的模拟输入函数就行。比如:

先在代码开头加个模拟输入的缓冲区和自定义函数:

// 模拟输入的内容,比如先选menu2里的a,再回到主菜单退出
int mock_input_pos = 0;
char mock_input[] = "1\na\nq\n";

// 自定义的模拟getchar函数
int mock_getchar() {
    if (mock_input[mock_input_pos] == '\0') {
        return EOF; // 输入结束
    }
    return mock_input[mock_input_pos++];
}

然后把原来代码里的selected = getchar();改成selected = mock_getchar();,编译运行后,程序就会自动按你预设的输入走一遍流程,特别适合调试的时候用。

方法3:系统级模拟真实按键(不修改代码的黑科技)

如果你不想改代码,还想模拟真实的键盘敲击(就像有人真的在按键盘一样),可以用系统自带的工具或者API:

对于Linux系统

装个xdotool工具(大部分发行版可以用apt install xdotool或者yum install xdotool安装):

  1. 先运行你的菜单程序
  2. 打开另一个终端,输入命令:
    xdotool type "1\nq\n"
    
    注意要快速切换回菜单程序的窗口,xdotool会把按键发送到当前活动窗口。

对于Windows系统

可以用Windows API里的SendInput来模拟按键,写个小辅助程序:

#include <windows.h>

// 模拟按下并释放一个字符
void pressChar(char c) {
    INPUT input = {0};
    input.type = INPUT_KEYBOARD;
    input.ki.wVk = VkKeyScanA(c); // 把字符转成虚拟键码

    // 按下按键
    SendInput(1, &input, sizeof(INPUT));
    // 释放按键
    input.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &input, sizeof(INPUT));
}

int main() {
    Sleep(3000); // 给你3秒时间切换到菜单程序窗口
    pressChar('1');
    pressChar('\n');
    pressChar('q');
    pressChar('\n');
    return 0;
}

编译运行这个辅助程序,然后快速切到你的菜单程序窗口,它就会自动帮你按按键了。

小提醒

  • 不管用哪种方法,记得要包含换行符\n,因为你的程序里会跳过单独的'\n',模拟输入里的换行对应手动按回车的操作。
  • 用系统级工具的时候,一定要确保菜单程序是当前活动窗口,不然按键会发送到别的地方哦。

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

火山引擎 最新活动