2012-06-03 192 views
1

我正在尋找一種方法來創建一個程序,它將執行一個鼠標單擊,它在屏幕上找到某種顏色。自動在屏幕上點擊鼠標

例如,如果屏幕上有紅框,我想讓程序點擊它的中心的紅框。

我該如何在C#中完成此操作?

+0

對不起?我不明白一個字。 – JohnB

+0

你需要進一步澄清你的意思。你是否要告訴它在哪裏點擊或是否需要以某種方式找到紅色框?如果有兩個紅色的盒子會怎樣?有多少像素可以定義一個「盒子」等等 – GazTheDestroyer

+0

@GazTheDestroyer我並不是在尋找一個解決方案,只是一種實現方式,對於這種情況,屏幕上只會有一個紅色框 –

回答

5

當你只是想一般的方式,我並沒有真正做到盡善盡美,但這裏的理念是:

有采取截屏的方法:

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(請閱讀herehere)對此實現進行DRASTICALLY改進。

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

然後,使用將成爲:

0

看看Sikuli我明白它是用來識別按鈕的。不在C#

許可證是麻省理工學院,所以你可以使用它很自由。