You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SendMessage实现鼠标自动左键点击失效求助(Windows 10)

解决Windows 10下控制台程序模拟鼠标左键点击的问题

你的代码无效的核心原因有三点:

  • SendMessage第一个参数传0(HWND_BROADCAST)错误,鼠标消息需要发送给光标当前指向的窗口,而非广播给所有窗口;
  • 仅发送WM_LBUTTONDOWN不完整,完整点击需要按下+弹起两个动作;
  • 未传递正确的光标坐标参数,WM_LBUTTONDOWN的最后一个参数需用MAKELPARAM包装光标相对于目标窗口客户区的坐标。

以下是两种可行的实现方案:

方案1:通过SendMessage给目标窗口发消息(针对特定窗口)

先定位光标所在窗口,再发送完整的点击消息:

#include <windows.h>

int main()
{
    Sleep(2000); // 预留时间移动光标到目标位置

    POINT cursorPos;
    GetCursorPos(&cursorPos); // 获取屏幕坐标下的光标位置
    HWND targetWnd = WindowFromPoint(cursorPos); // 获取光标指向的窗口句柄
    
    // 将屏幕坐标转换为目标窗口的客户区坐标
    ScreenToClient(targetWnd, &cursorPos);
    
    // 发送左键按下消息,带上MK_LBUTTON标志和坐标
    SendMessage(targetWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(cursorPos.x, cursorPos.y));
    Sleep(50); // 模拟真实点击的按下间隔
    // 发送左键弹起消息
    SendMessage(targetWnd, WM_LBUTTONUP, 0, MAKELPARAM(cursorPos.x, cursorPos.y));

    return 0;
}

方案2:用SendInput模拟硬件输入(兼容性更强)

SendInput是系统级输入模拟,会被所有程序识别为真实鼠标操作,比SendMessage适配性更好:

#include <windows.h>

int main()
{
    Sleep(2000);

    // 构造鼠标按下的输入事件
    INPUT inputDown = {0};
    inputDown.type = INPUT_MOUSE;
    inputDown.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;

    // 构造鼠标弹起的输入事件
    INPUT inputUp = {0};
    inputUp.type = INPUT_MOUSE;
    inputUp.mi.dwFlags = MOUSEEVENTF_LEFTUP;

    // 发送按下事件
    SendInput(1, &inputDown, sizeof(INPUT));
    Sleep(50);
    // 发送弹起事件
    SendInput(1, &inputUp, sizeof(INPUT));

    return 0;
}

注意事项

  • 编译时需链接user32.lib(多数Windows编译器会自动处理,若报错需手动添加链接选项);
  • 若要操作受权限保护的窗口,需以管理员身份运行控制台程序。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:40:04