如何实现C/C++同时生成回车键与鼠标左键点击输入?
问题描述
本人仅熟悉C语言,对C#了解甚少,完全不懂C++。曾听闻C语言因逐行读取、POSIX相关特性等无法支持多线程,但我的需求是让两个输入函数同时运行,可接受引入C++相关库。我尝试过以下代码:
#include<stdio.h> #include<windows.h> #include<conio.h> // Display message until key is pressed. // This structure will be used to create the keyboard and mouse // input event int main () { int x=1; INPUT ip,ip2,ip3; ip.type = 0; ip.mi.mouseData = XBUTTON1; ip.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; ip.mi.time = 0; ip2.type= 0; ip2.mi.mouseData=XBUTTON1; ip2.mi.dwFlags=MOUSEEVENTF_LEFTUP; ip2.mi.time = 0; ip3.type= INPUT_KEYBOARD; ip3.ki.wVk= VK_RETURN; ip3.ki.dwFlags=0; ip3.ki.time=0; while(x=1){ Sleep(5000); SendInput(1,&ip3,sizeof(ip3)); SendInput(1,&ip,sizeof(ip)); SendInput(1,&ip2,sizeof(ip2)); } }
我实际想要实现的是让桌面同时读取模拟的回车键按下与鼠标左键点击操作,不局限于当前代码,请提供可实现该功能的优化版本代码。
优化实现方案
Windows平台下C语言完全可以通过系统API实现多线程,不需要依赖C++库。下面的代码用CreateThread创建两个独立线程,分别负责模拟回车键和鼠标左键点击操作,实现“同时”执行的效果,同时修复了原代码中INPUT结构体初始化不完整的问题:
#include <stdio.h> #include <windows.h> #include <conio.h> // 线程函数:模拟回车键按下并释放 DWORD WINAPI SimulateEnter(LPVOID lpParam) { INPUT enterInput[2] = {0}; // 按下回车键 enterInput[0].type = INPUT_KEYBOARD; enterInput[0].ki.wVk = VK_RETURN; // 释放回车键 enterInput[1].type = INPUT_KEYBOARD; enterInput[1].ki.wVk = VK_RETURN; enterInput[1].ki.dwFlags = KEYEVENTF_KEYUP; while (1) { Sleep(5000); // 发送完整的按键事件(按下+释放) SendInput(2, enterInput, sizeof(INPUT)); printf("模拟回车键操作\n"); } return 0; } // 线程函数:模拟鼠标左键点击 DWORD WINAPI SimulateMouseClick(LPVOID lpParam) { INPUT mouseInput[2] = {0}; // 鼠标左键按下 mouseInput[0].type = INPUT_MOUSE; mouseInput[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN; // 鼠标左键释放 mouseInput[1].type = INPUT_MOUSE; mouseInput[1].mi.dwFlags = MOUSEEVENTF_LEFTUP; while (1) { Sleep(5000); // 发送完整的鼠标点击事件(按下+释放) SendInput(2, mouseInput, sizeof(INPUT)); printf("模拟鼠标左键点击\n"); } return 0; } int main() { HANDLE hThreadEnter, hThreadMouse; // 创建两个独立线程 hThreadEnter = CreateThread(NULL, 0, SimulateEnter, NULL, 0, NULL); hThreadMouse = CreateThread(NULL, 0, SimulateMouseClick, NULL, 0, NULL); // 等待用户按任意键退出程序 printf("程序运行中,按任意键退出...\n"); _getch(); // 终止线程并释放资源 TerminateThread(hThreadEnter, 0); TerminateThread(hThreadMouse, 0); CloseHandle(hThreadEnter); CloseHandle(hThreadMouse); return 0; }
核心说明
- 多线程实现:借助Windows原生API
CreateThread创建两个并行线程,分别处理键盘和鼠标模拟,实现“同时”执行的需求。 - 完整事件模拟:每个操作都包含按下+释放两个步骤,避免出现按键/鼠标一直处于按下状态的异常。
- 安全初始化:用
{0}初始化INPUT数组,确保所有未显式赋值的字段被置为0,规避未定义行为。 - 可控退出:添加
_getch()等待用户输入,解决原代码无限循环无法终止的问题。
内容的提问来源于stack exchange,提问作者bilbo
相关产品推荐
相关产品推荐

