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

求助完善C#鼠标左键点击并移动图像的代码实现

完善鼠标拖拽图像的功能代码

你的现有代码已经实现了定位图像并按下鼠标左键的逻辑,要完成完整的拖拽(点击-移动-释放)流程,需要补充释放左键和鼠标移动的方法,并调整测试逻辑实现完整的拖拽链路。

第一步:补充鼠标操作的完整方法

在原有代码基础上,添加释放左键和移动鼠标的方法,同时优化鼠标移动的绝对定位逻辑:

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class MouseOperations
{
    [DllImport("user32.dll")]
    static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

    [Flags]
    public enum MouseEventFlags
    {
        LEFTDOWN = 0x00000002,
        LEFTUP = 0x00000004,
        MIDDLEDOWN = 0x00000020,
        MIDDLEUP = 0x00000040,
        MOVE = 0x00000001,
        ABSOLUTE = 0x00008000,
        RIGHTDOWN = 0x00000008,
        RIGHTUP = 0x00000010,
    }

    // 移动鼠标到指定绝对位置
    public void MouseMove(Point targetPos)
    {
        // 转换为mouse_event需要的绝对坐标范围(0-65535)
        int dx = (targetPos.X * 65535) / Screen.PrimaryScreen.Bounds.Width;
        int dy = (targetPos.Y * 65535) / Screen.PrimaryScreen.Bounds.Height;
        mouse_event((int)(MouseEventFlags.MOVE | MouseEventFlags.ABSOLUTE), dx, dy, 0, 0);
    }

    // 按下左键
    public void MouseDown(Point p)
    {
        Cursor.Position = p;
        mouse_event((int)MouseEventFlags.LEFTDOWN, 0, 0, 0, 0);
    }

    // 释放左键
    public void MouseUp()
    {
        mouse_event((int)MouseEventFlags.LEFTUP, 0, 0, 0, 0);
    }
}

第二步:修改测试按钮逻辑,实现完整拖拽流程

在你的btntestcode_Click方法中,添加移动到目标位置和释放左键的步骤,注意替换targetMovePoint为你实际需要移动到的坐标:

private void btntestcode_Click(object sender, EventArgs e)
{
    var mouseOps = new MouseOperations();
    var screen = CaptureHelper.CaptureScreen();
    var subBitmap = ImageScanOpenCV.GetImage("testmousemove.PNG");
    var targetPoint = ImageScanOpenCV.FindOutPoint((Bitmap)screen, subBitmap);

    if (targetPoint != null)
    {
        // 1. 移动到图像位置并按下左键
        mouseOps.MouseDown((Point)targetPoint);
        // 2. 等待一小段时间确保按下操作生效(可选,根据实际情况调整)
        System.Threading.Thread.Sleep(100);
        // 3. 定义需要移动到的目标位置,这里示例为屏幕右下角,替换为你的目标坐标
        Point targetMovePoint = new Point(Screen.PrimaryScreen.Bounds.Width - 100, Screen.PrimaryScreen.Bounds.Height - 100);
        mouseOps.MouseMove(targetMovePoint);
        // 4. 再次等待确保移动完成
        System.Threading.Thread.Sleep(100);
        // 5. 释放左键完成拖拽
        mouseOps.MouseUp();
    }
}

关键说明

  • MouseMove方法使用了ABSOLUTE标志,将屏幕坐标转换为mouse_event要求的0-65535范围,确保鼠标精准移动到目标绝对位置。
  • 添加Thread.Sleep是为了模拟人类操作的延迟,避免系统因操作过快而无法识别拖拽动作,可根据实际场景调整时长。
  • 替换targetMovePoint为你实际需要将图像移动到的坐标点即可。

内容的提问来源于stack exchange,提问作者Đức Cường

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:40:40