2

画面上の特定の色を見つける場所でマウスクリックを実行するプログラムを作成する方法を探しています。

たとえば、画面に赤いボックスがある場合、プログラムで画面の中央にある赤いボックスをクリックします。

どうすればC#でこれを達成できますか?

4

1 に答える 1

6

あなたは一般的な方法だけを望んでいたので、私はそれを本当に完璧にはしませんでしたが、ここにアイデアがあります:

スクリーンショットを撮る方法があります。

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;
}

必要なもう1つの方法は、特定のポイントをクリックする方法です。

[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);
}

そして最後に、それをすべてまとめる1つ:

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.");
}
于 2012-06-03T12:56:33.420 に答える