C# 从窗口读取特定像素颜色
我目前正在从进程窗口读取特定像素颜色,如下所示:C# 从窗口读取特定像素颜色,c#,winforms,C#,Winforms,我目前正在从进程窗口读取特定像素颜色,如下所示: [DllImport("gdi32.dll")] private static extern int BitBlt(IntPtr srchDc, int srcX, int srcY, int srcW, int srcH, IntPtr desthDc, int destX, int destY, int op); public static Color GetPixel(IntPtr hw
[DllImport("gdi32.dll")]
private static extern int BitBlt(IntPtr srchDc, int srcX, int srcY, int srcW,
int srcH, IntPtr desthDc, int destX, int destY, int op);
public static Color GetPixel(IntPtr hwnd, int x, int y)
{
var screenPixel = new Bitmap(1, 1);
using (Graphics gdest = Graphics.FromImage(screenPixel))
{
using (Graphics gsrc = Graphics.FromHwnd(
MemoryHandler.GetMainWindowHandle()))
{
IntPtr hsrcdc = gsrc.GetHdc();
IntPtr hdc = gdest.GetHdc();
BitBlt(hdc, 0, 0, 1, 1, hsrcdc, x, y,
(int)CopyPixelOperation.SourceCopy);
gdest.ReleaseHdc();
gsrc.ReleaseHdc();
}
}
return screenPixel.GetPixel(0, 0);
}
[DllImport(“gdi32.dll”)]
静态外部COLORREF GetPixel(IntPtr hdc、intnxpos、intnypos);
[StructLayout(LayoutKind.Sequential)]
公共结构COLORREF
{
公共单位颜色词;
公共COLORREF(System.Drawing.Color)
{
ColorDWORD=(uint)color.R+((uint)color.G)8,(int)(0x00FF0000U和ColorDWORD)>>16);
}
公共无效设置颜色(System.Drawing.Color)
{
ColorDWORD=(uint)color.R+((uint)color.G)您没有处理screenPixel
,尽管我怀疑这是问题所在,除非您多次调用它。@Rotem感谢您的输入。我想我还是这样做吧。Graphics.CopyFromScreen()避免所有的pinvoke。@HansPassant请看一下我的更新。这就是你所指的吗?我只得到一个白色(255255)像素。
[DllImport("gdi32.dll")]
static extern COLORREF GetPixel(IntPtr hdc, int nXPos, int nYPos);
[StructLayout(LayoutKind.Sequential)]
public struct COLORREF
{
public uint ColorDWORD;
public COLORREF(System.Drawing.Color color)
{
ColorDWORD = (uint)color.R + (((uint)color.G) << 8) +
(((uint)color.B) << 16);
}
public System.Drawing.Color GetColor()
{
return System.Drawing.Color.FromArgb((int)(0x000000FFU & ColorDWORD),
(int)(0x0000FF00U & ColorDWORD) >> 8, (int)(0x00FF0000U & ColorDWORD) >> 16);
}
public void SetColor(System.Drawing.Color color)
{
ColorDWORD = (uint)color.R + (((uint)color.G) << 8)
+ (((uint)color.B) << 16);
}
}