如何向自制响应键盘输入的控制台菜单程序传递键盘输入模拟?
如何模拟键盘输入到你的控制台菜单程序
嘿,我瞅了你的控制台菜单代码,要给它模拟键盘输入其实有几种实用的路子,我给你挨个唠清楚:
方法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安装):
- 先运行你的菜单程序
- 打开另一个终端,输入命令:
注意要快速切换回菜单程序的窗口,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




