从外部程序读取错误的像素颜色,需要偏移吗?
Wrong pixel colors are being read from external program, Offset needed?
我正在尝试从外部程序读取像素,然后获取其 RGB 颜色。
每当我用鼠标找到位置并提取像素颜色时,这都能完美地工作。但是,当我尝试从控制台程序执行此操作时,RBG 颜色又回来了……与我预期的不同。
我相信这可能是缺少偏移量,所以每当我使用鼠标找到位置时,它都会使用我的屏幕像素,每当我使用下面的函数激活外部程序时,它都会从中获取像素位置window句柄。
这也可能是因为它是一款游戏,而且它的绘制方式有所不同,有什么提示吗?如果我尝试从记事本中获取像素颜色,它会起作用。
[DllImport("user32.dll")] static extern bool SetForegroundWindow(IntPtr hWnd);
public static void Activate(string processName = "CookieGame")
{
var processes = Process.GetProcessesByName(processName);
var process = processes.FirstOrDefault();
if (process != null)
{
SetForegroundWindow(process.MainWindowHandle);
}
}
我使用以下函数从某个位置提取像素颜色,这是 运行 在我将程序设置为活动后 window(上面的函数):
public class MailReader
{
[DllImport("user32.dll")] public static extern bool GetCursorPos(ref Point lpPoint);
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)] public static extern int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);
static Bitmap screenPixel = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
public static Color GetColorAt(Point location)
{
using (Graphics gdest = Graphics.FromImage(screenPixel))
{
using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero)){
IntPtr hSrcDC = gsrc.GetHdc();
IntPtr hDC = gdest.GetHdc();
int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, location.X, location.Y, (int)CopyPixelOperation.SourceCopy);
gdest.ReleaseHdc();
gsrc.ReleaseHdc();
}
}
return screenPixel.GetPixel(0, 0);
}
}
Conole 程序是 运行,这个 returns 我告诉它的正确的 X 和 Y 像素,但是颜色回来了:
namespace TestProgram.TestConsole
{
class Program
{
static void Main(string[] args)
{
var model = new PixelInformation
{
X = 505,
Y = 27,
R = 117,
G = 208,
B = 50
};
var point = new Point();
point.X = model.X;
point.Y = model.Y;
ActivateWindow.Activate("cookieGame");
var location = PixelReader.GetColorAt(point);
Console.WriteLine("Position X: " + point.X + " Y: " + point.Y);
Console.WriteLine("R:" + location.R + " " + "G:" + location.G + " B:" + location.B);
Console.ReadKey();
}
}
}
这些症状与您的系统使用非 100% 的字体缩放和进程不支持 DPI 一致。因此,该过程受 DPI 虚拟化的影响。
我正在尝试从外部程序读取像素,然后获取其 RGB 颜色。 每当我用鼠标找到位置并提取像素颜色时,这都能完美地工作。但是,当我尝试从控制台程序执行此操作时,RBG 颜色又回来了……与我预期的不同。
我相信这可能是缺少偏移量,所以每当我使用鼠标找到位置时,它都会使用我的屏幕像素,每当我使用下面的函数激活外部程序时,它都会从中获取像素位置window句柄。
这也可能是因为它是一款游戏,而且它的绘制方式有所不同,有什么提示吗?如果我尝试从记事本中获取像素颜色,它会起作用。
[DllImport("user32.dll")] static extern bool SetForegroundWindow(IntPtr hWnd);
public static void Activate(string processName = "CookieGame")
{
var processes = Process.GetProcessesByName(processName);
var process = processes.FirstOrDefault();
if (process != null)
{
SetForegroundWindow(process.MainWindowHandle);
}
}
我使用以下函数从某个位置提取像素颜色,这是 运行 在我将程序设置为活动后 window(上面的函数):
public class MailReader
{
[DllImport("user32.dll")] public static extern bool GetCursorPos(ref Point lpPoint);
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)] public static extern int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);
static Bitmap screenPixel = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
public static Color GetColorAt(Point location)
{
using (Graphics gdest = Graphics.FromImage(screenPixel))
{
using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero)){
IntPtr hSrcDC = gsrc.GetHdc();
IntPtr hDC = gdest.GetHdc();
int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, location.X, location.Y, (int)CopyPixelOperation.SourceCopy);
gdest.ReleaseHdc();
gsrc.ReleaseHdc();
}
}
return screenPixel.GetPixel(0, 0);
}
}
Conole 程序是 运行,这个 returns 我告诉它的正确的 X 和 Y 像素,但是颜色回来了:
namespace TestProgram.TestConsole
{
class Program
{
static void Main(string[] args)
{
var model = new PixelInformation
{
X = 505,
Y = 27,
R = 117,
G = 208,
B = 50
};
var point = new Point();
point.X = model.X;
point.Y = model.Y;
ActivateWindow.Activate("cookieGame");
var location = PixelReader.GetColorAt(point);
Console.WriteLine("Position X: " + point.X + " Y: " + point.Y);
Console.WriteLine("R:" + location.R + " " + "G:" + location.G + " B:" + location.B);
Console.ReadKey();
}
}
}
这些症状与您的系统使用非 100% 的字体缩放和进程不支持 DPI 一致。因此,该过程受 DPI 虚拟化的影响。