如何通过C语言按PID向运行中的cmd.exe发送回车键触发新命令提示符
修复思路
你的原有代码存在核心逻辑错误:调用WriteConsole写入控制台输出流,写入的内容只会被识别为普通输出文本,根本不会进入cmd进程的输入队列,自然无法触发cmd的回车处理逻辑。
你需要调用WriteConsoleInput向控制台输入缓冲区写入完整的键盘事件,模拟用户真实按下回车键的操作。
修改后的可运行代码
#include <Windows.h> #include <stdio.h> // 编译命令:gcc send_enter.c -o send_enter.exe int main(int argc, char** argv) { if (argc < 2) { printf("用法:send_enter.exe <目标cmd进程PID>\n"); return 1; } DWORD pid = atoi(argv[1]); printf("目标PID:%d\n", pid); if (!FreeConsole()) { DWORD err = GetLastError(); // 错误码1006表示当前进程没有绑定控制台,属于正常情况,可以忽略 if (err != ERROR_INVALID_HANDLE) { printf("FreeConsole失败,错误码:%d\n", err); return 1; } } if (!AttachConsole(pid)) { printf("AttachConsole失败,错误码:%d\n", GetLastError()); return 2; } HANDLE hConsoleInput = GetStdHandle(STD_INPUT_HANDLE); if (hConsoleInput == INVALID_HANDLE_VALUE) { printf("获取输入句柄失败,错误码:%d\n", GetLastError()); FreeConsole(); return 3; } INPUT_RECORD ir[2] = {0}; // 构造回车键按下事件 ir[0].EventType = KEY_EVENT; ir[0].Event.KeyEvent.bKeyDown = TRUE; ir[0].Event.KeyEvent.wVirtualKeyCode = VK_RETURN; ir[0].Event.KeyEvent.uChar.UnicodeChar = L'\r'; ir[0].Event.KeyEvent.wRepeatCount = 1; // 构造回车键抬起事件 ir[1].EventType = KEY_EVENT; ir[1].Event.KeyEvent.bKeyDown = FALSE; ir[1].Event.KeyEvent.wVirtualKeyCode = VK_RETURN; ir[1].Event.KeyEvent.uChar.UnicodeChar = L'\r'; ir[1].Event.KeyEvent.wRepeatCount = 1; DWORD dwWritten; if (!WriteConsoleInput(hConsoleInput, ir, 2, &dwWritten)) { printf("写入输入事件失败,错误码:%d\n", GetLastError()); FreeConsole(); return 4; } printf("已成功发送回车事件\n"); FreeConsole(); return 0; }
注意事项
- 如果目标cmd是SYSTEM权限的服务进程,你的程序需要以管理员权限运行,且要保证和目标进程处于同一个Windows会话中,否则
AttachConsole会报权限错误。 - 执行成功后目标cmd会立即生成新的命令提示符,和用户手动按回车键效果完全一致。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

