在屏幕上自动化鼠标点击

3
我正在寻找一种创建程序的方法,该程序能在屏幕上找到某个特定颜色并执行鼠标点击操作。
例如,如果屏幕上有一个红色框,我希望程序能够点击框中心的红色部分。
我该如何在C#中实现这个功能?

抱歉?我不明白一句话。 - JohnB
你需要进一步澄清你的意思。你是要告诉它在哪里点击,还是必须以某种方式找到红色框?如果有两个红色框怎么办?多少像素构成一个“框”等问题。 - GazTheDestroyer
@GazTheDestroyer 我并不是特别在寻找解决方案,只是想找到一种实现它的方法。对于这种情况,在屏幕上只会有一个红色框框。 - James Teare
@JamesTeare 所以从技术上讲,你只需要在屏幕上找到一个红色的像素,点击它,然后停止就可以了吗? - SimpleVar
您的应用程序是否会处理鼠标点击事件? - Jacob Seleznev
1个回答

7

由于您只需要一种通用方法,所以我并没有完美地实现它,但是这里有一个想法:

有一个获取屏幕截图的方法:

public Bitmap ScreenShot()
{
    var screenShot = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                Screen.PrimaryScreen.Bounds.Height,
                                PixelFormat.Format32bppArgb);

    using (var g = Graphics.FromImage(screenShot))
    {
        g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);
    }

    return screenShot;
}

查找位图中某种颜色的方法: 注意,使用不安全代码和LockBits可以大大提高此实现(在此处阅读这里这里)。

public Point? GetFirstPixel(Bitmap bitmap, Color color)
{
    for (var y = 0; y < bitmap.Height; y++)
    {
        for (var x = 0; x < bitmap.Width; x++)
        {
            if (bitmap.GetPixel(x, y).Equals(color))
            {
                return new Point(x, y);
            }
        }
    }

    return null;
}

你将需要另一种方法,用于点击某个特定点:

[DllImport("user32.dll",
           CharSet=CharSet.Auto,
           CallingConvention=CallingConvention.StdCall)]
private static extern void mouse_event(long dwFlags,
                                      long dx,
                                      long dy,
                                      long cButtons,
                                      long dwExtraInfo);

private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;

public void Click(Point pt)
{
    Cursor.Position = pt;
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, pt.X, pt.Y, 0, 0);
}

最后,总结一下:
public bool ClickOnFirstPixel(Color color)
{
    var pt = GetFirstPixel(ScreenShot(), color);

    if (pt.HasValue)
    {
        Click(pt.Value);
    }

    // return whether found pixel and clicked it
    return pt.HasValue;
}

然后,使用方法如下:
if (ClickOnFirstPixel(Color.Red))
{
    Console.WriteLine("Found a red pixel and clicked it!");
}
else
{
    Console.WriteLine("Didn't find a red pixel, didn't click.");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接