我正在制作一个程序,该程序检测屏幕的某个扇区以执行所需的操作,并且通过截屏逐像素查看屏幕快照来找到要分析的扇区,并将其与所需的更改进行比较但我有一个问题,我使用计时器每秒钟每20次拍摄一次屏幕快照,负责拍摄该屏幕快照的句子以我完全不理解的异常结束,它有时可以正常工作,直到出现异常“ ArgumentsException”出现,并显示消息“参数无效”,因此我不知道可能会发生什么,我应该发送正确的参数,甚至将句子设置为空,以为有什么遗漏但没有,同样的事情还在继续,我不明白为什么。
现在,我不知道是否还有其他方法可以直接检测并且不进行屏幕截图,而无需捕获屏幕快照,因为我发现从句子中捕获图像的句子存在问题。屏幕。
我用来截图的代码是:
screenCapture = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppRgb);
g = Graphics.FromImage(screenCapture);
g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, screenCapture.Size, CopyPixelOperation.SourceCopy);
有时候问题出在位图上,有时是图形出同样的问题,所以您可以根据我的需要推荐我吗?
答案 0 :(得分:1)
无需截屏,您可以使用Win32 API GetPixel:https://www.pinvoke.net/default.aspx/gdi32/getpixel.html
using System;
using System.Drawing;
using System.Runtime.InteropServices;
sealed class Win32
{
[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("user32.dll")]
static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);
[DllImport("gdi32.dll")]
static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);
static public System.Drawing.Color GetPixelColor(int x, int y)
{
IntPtr hdc = GetDC(IntPtr.Zero);
uint pixel = GetPixel(hdc, x, y);
ReleaseDC(IntPtr.Zero, hdc);
Color color = Color.FromArgb((int)(pixel & 0x000000FF),
(int)(pixel & 0x0000FF00) >> 8,
(int)(pixel & 0x00FF0000) >> 16);
return color;
}
}
或者认为Blit比屏幕截图便宜,C# - Faster Alternatives to SetPixel and GetPixel for Bitmaps for Windows Forms App