1. Windows 下 C 语言控制鼠标键盘,为什么值得认真做一遍
如果你在 Windows 上写 C,想实现「自动点一下」「自动输入一段字符串」「定时刷新页面」这类需求,绕不开的就是mouse_event、keybd_event、GetCursorPos、GetSystemMetrics这几个 Win32 API。它们属于user32.dll,不需要额外装库,gcc或 MSVC 直接编译就能跑,非常适合做小工具、自动化脚本、批量操作辅助。
但真正落地时,问题往往不在 API 本身,而在两件事:一是坐标换算和按键码容易写错,二是写代码过程中反复查文档、改参数、试运行,效率很低。我的做法是把 AI 辅助编码工具接进来,用 TaoToken 作为统一的 Key/API 通道,让 Cline 这类工具在编辑器里直接帮我补全 Win32 调用、解释参数、生成测试用例。这样一次配置好,后面写鼠标键盘控制代码就顺很多。
这篇就按「先配好 AI 编码通道 → 再写最小可运行示例 → 最后验证行为」的顺序走一遍,目标是你在 Windows 上照着做能跑通,并且后续扩展成连点器、自动输入器时不用重新折腾环境。
2. 前置准备:TaoToken 统一 Key 接入 AI 编码工具
2.1 为什么用 TaoToken 而不是每个工具单独配 Key
写 C 控制鼠标键盘这类代码,我经常要在「查 API 参数」「生成按键码表」「写循环逻辑」之间切换。如果每个 AI 工具都单独申请 Key、单独配 Base URL,管理起来很乱。TaoToken 提供的是统一 Key 和统一 API 入口,Cline、CC Switch 这类支持自定义 OpenAI 兼容接口的工具,都指向同一个地址就行。
官网入口在这里:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 根地址是 https://taotoken.net/api (这个不加 UTM)。注意 API 地址后面通常要接/v1,具体看工具要求。
2.2 拿到 Key 并确认可用模型
先到控制台创建 API Key:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,在 API Keys 页面生成一个 Key 并复制保存。如果你不确定用哪个模型,可以先去模型对话页面试一下:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite ,随便问一句「Windows 下 mouse_event 的坐标怎么换算」,能正常返回就说明 Key 和通道没问题。
长期写代码、跑 Agent 的话,可以看下 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite ,比按次调用更适合高频编码场景。
2.3 在 Cline / CC Switch 里填配置
以 Cline 为例,在设置里选「OpenAI Compatible」,然后填:
| 配置项 | 填写内容 |
|---|---|
| Base URL | https://taotoken.net/api/v1 |
| API Key | 你在控制台生成的 Key |
| Model | 按控制台可用列表填,如 claude 系列或 gpt 系列 |
| Provider | OpenAI Compatible |
CC Switch 类似,本质是切换不同 API 端点,把 Base URL 指向 TaoToken 的 API 地址即可。配置完在编辑器里让它生成一段keybd_event示例,能正常输出就说明接好了。
3. 可复制配置骨架:config.toml 与 settings.json
3.1 config.toml 骨架
有些工具用 TOML 管理配置,下面这份可以直接改 Key 后用:
# TaoToken 统一接入配置 [provider] name = "taotoken" base_url = "https://taotoken.net/api/v1" api_key = "sk-你的Key" model = "claude-3-5-sonnet" [editor] auto_complete = true context_lines = 200 [agent] max_tokens = 4096 temperature = 0.2temperature调低一点,生成 C 代码时更稳,不容易瞎编不存在的函数名。
3.2 settings.json 骨架
VS Code 系插件常用 JSON:
{ "taotoken.baseUrl": "https://taotoken.net/api/v1", "taotoken.apiKey": "sk-你的Key", "taotoken.model": "claude-3-5-sonnet", "taotoken.maxTokens": 4096, "taotoken.temperature": 0.2, "editor.quickSuggestions": { "other": true, "comments": false, "strings": true } }注意:Key 不要提交到 Git 仓库,建议放在本地用户配置或环境变量里,代码里用
getenv读取。
3.3 用环境变量兜底
如果你不想把 Key 写死在配置文件,可以在系统环境变量里加TAOTOKEN_API_KEY,然后在工具配置里引用。这样换机器时只改环境变量,配置文件可以跟着项目走。
4. 最小可运行示例:C 语言控制鼠标点击与键盘输入
4.1 编译环境确认
Windows 上用 MinGW-w64 的 gcc 最省事,命令行执行:
gcc --version能看到版本号即可。没有的话装一个 MinGW-w64,把bin目录加进 PATH。MSVC 也可以,把下面的gcc换成cl,链接时加user32.lib。
4.2 鼠标点击示例
先写一个在当前鼠标位置单击的程序:
#include <stdio.h> #include <windows.h> int main(void) { POINT pt = {0, 0}; int x_len, y_len; GetCursorPos(&pt); x_len = GetSystemMetrics(SM_CXSCREEN); y_len = GetSystemMetrics(SM_CYSCREEN); printf("screen: %dx%d, cursor: %ld,%ld\n", x_len, y_len, pt.x, pt.y); mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, pt.x * 65535 / x_len, pt.y * 65535 / y_len, 0, 0); Sleep(50); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); return 0; }编译:
gcc mouse_click.c -o mouse_click.exe -luser32运行后鼠标会在当前位置点一下。这里的关键是MOUSEEVENTF_ABSOLUTE要求坐标归一化到 0–65535,所以要用pt.x * 65535 / x_len换算,直接传像素值会点偏。
4.3 键盘输入示例
下面这个函数把字符串按字符模拟输入,支持大小写:
#include <string.h> #include <windows.h> void inputRun(const char *inStr) { unsigned int i = 0; int shiftFlag = 0; char put; for (i = 0; i < strlen(inStr); i++) { put = inStr[i]; if (put >= 'a' && put <= 'z') { put = put - 32; } else if (put >= 'A' && put <= 'Z') { keybd_event(16, 0, 0, 0); // 按下 Shift shiftFlag = 1; } keybd_event(put, 0, 0, 0); keybd_event(put, 0, 2, 0); if (shiftFlag) { keybd_event(16, 0, 2, 0); // 松开 Shift shiftFlag = 0; } Sleep(60); } }调用inputRun("Hello123");就能在焦点窗口里输入。注意keybd_event第三个参数 0 是按下、2 是抬起,别写反。
4.4 常用按键码对照
| 按键 | 键码 | 按键 | 键码 |
|---|---|---|---|
| A–Z | 65–90 | 0–9 | 48–57 |
| Enter | 13 | Space | 32 |
| Shift | 16 | Ctrl | 17 |
| Esc | 27 | Tab | 9 |
小写字母在keybd_event里直接用大写键码即可,系统会按当前 Shift 状态处理。
5. 验证请求与成功结果
5.1 验证 AI 通道
在 Cline 里输入「帮我写一个 Windows 下用 mouse_event 移动鼠标到 (500,300) 并点击的 C 函数」,如果返回的代码里包含MOUSEEVENTF_ABSOLUTE和 65535 换算,说明 TaoToken 通道和模型都正常。返回慢的话检查 Base URL 是否漏了/v1。
5.2 验证鼠标程序
编译运行mouse_click.exe,把鼠标移到屏幕任意位置,运行后应该看到控制台打印分辨率和当前坐标,然后鼠标原地点击一次。如果没反应,先确认是不是被安全软件拦了模拟输入。
5.3 验证键盘程序
写一个main调用inputRun("Test123"),打开记事本,把光标放进去,运行程序,记事本里应该逐字出现Test123。字符间隔由Sleep(60)控制,太快可能丢字符,可以调到 80–100。
6. 本篇常见错误排查
6.1 编译报 undefined reference tomouse_event
链接时没加user32。gcc 加-luser32,MSVC 在项目属性里加user32.lib。
6.2 鼠标点击位置偏移
最常见原因是坐标没归一化。MOUSEEVENTF_ABSOLUTE下坐标范围是 0–65535,必须用x * 65535 / x_len换算。另外多显示器环境下SM_CXSCREEN只返回主屏宽度,跨屏操作要用SM_CXVIRTUALSCREEN。
6.3 键盘输入大小写不对
keybd_event不区分大小写键码,大写要靠 Shift。上面inputRun里对A–Z按 Shift 就是这个原因。如果输入全是大写,检查是不是 Shift 没松开。
6.4 AI 生成的代码用了不存在的函数
把temperature调低,或者在提示里明确「只用 Win32 API,不要用第三方库」。TaoToken 通道本身不影响代码正确性,但模型选型有影响,写系统级代码建议用偏严谨的模型。
6.5 程序运行没反应
先看控制台有没有输出,再看任务管理器里进程是否一闪而过。模拟输入被拦截时通常不报错,只是没效果,可以临时关掉安全软件的「输入保护」测试。
7. 后续扩展与接入入口
跑通最小示例后,往连点器、自动输入器扩展就简单了:把mouse_event包成clickAt(x, y),把inputRun包成typeText(str),外面套循环和Sleep就行。写这些逻辑时,AI 辅助工具能帮你快速生成循环、边界判断、日志输出,省掉大量查文档时间。
如果你在配置或编译时卡住,优先检查 API Key 和接入文档:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite ,文档页在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。验证模型是否正常用模型对话页,长期写 C/Agent 项目用 Coding Plan 更划算。Claude Code 相关接入看 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite 。
最后提醒一句:模拟鼠标键盘属于系统级操作,写自动化工具时注意别在敏感窗口里乱点,测试阶段把Sleep留足,给自己留出按 Ctrl+C 的时间。