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

如何向其他应用发送鼠标点击?计算器点击指令失效求助

问题排查与修复方案

核心问题分析

你的代码存在几个关键错误导致鼠标点击指令无效:

  • 窗口句柄获取时机错误:在类成员初始化阶段调用FindWindow,此时程序刚启动,若计算器尚未打开,会导致window变量为无效句柄(0)。
  • 未正确构造lParam参数:WM_LBUTTONDOWN和WM_LBUTTONUP消息的lParam需要通过MakeLParam方法将坐标打包为「16位Y坐标(高)+16位X坐标(低)」的格式,你直接传入数值50不符合要求。
  • 坐标有效性未确认:硬编码的(50,50)坐标可能不在计算器的按钮区域,且需确保坐标是相对于窗口客户区左上角的相对值。

修复后的代码

public partial class Form1 : Form
{
    public static int MakeLParam(int x, int y) => (y << 16) | (x & 0xFFFF);
    
    [DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
    
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    const int WM_LBUTTONDOWN = 0x0201;
    const int WM_LBUTTONUP = 0x0202;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // 每次点击时重新获取窗口句柄,避免初始时未找到计算器
        IntPtr windowHandle = FindWindow(null, "计算器"); // 英文系统替换为"Calculator"
        if (windowHandle == IntPtr.Zero)
        {
            MessageBox.Show("未找到计算器窗口");
            return;
        }

        // 构造正确的lParam参数,替换为实际按钮的客户区坐标
        int lParam = MakeLParam(120, 150);
        
        // 发送鼠标按下与抬起消息
        bool downSuccess = PostMessage(windowHandle, WM_LBUTTONDOWN, 0, lParam);
        bool upSuccess = PostMessage(windowHandle, WM_LBUTTONUP, 0, lParam);

        if (!downSuccess || !upSuccess)
        {
            MessageBox.Show("消息发送失败");
        }
    }
}

额外注意事项

  • 窗口定位适配:若是UWP版计算器,可通过类名定位,将FindWindow改为FindWindow("ApplicationFrameWindow", "计算器")。
  • 坐标确认:使用Spy++工具查看计算器按钮的客户区坐标,替换代码中的(120,150)为实际位置。
  • 权限匹配:确保你的程序与计算器运行在同一权限级别,避免UAC权限隔离导致消息发送失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:47:26