Я пытаюсь прочитать пиксель из внешней программы, а затем получить его цвета RGB. Это работает безупречно, когда я нахожу местоположение с помощью мыши и извлекаю пиксельные цвета. Однако, когда я пытаюсь сделать это из консоли, цвета RBG возвращаются .. иначе, чем я ожидал.Неверные цвета пикселей читаются из внешней программы, требуется смещение?
Я считаю, что это может быть смещение отсутствует, поэтому всякий раз, когда я нахожу местоположение с помощью мыши, я использую пиксель моих экранов, и всякий раз, когда я активирую внешнюю программу с помощью функции ниже, она будет принимать пиксельные позиции из этого дескриптора окна.
Это может быть что-то вроде того, что это игра, и она нарисована по-другому, какие-нибудь советы? Если я попытаюсь получить пиксельные цвета из блокнота, это сработает.
[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);
}
}
Я использую следующие функции для извлечения цвета пикселей из места, это запускается после того, как я установил эту программу в качестве активного окна (функция выше):
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 запускаемой, это возвращает правильный 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();
}
}
}
Очень вероятно, что это до уровня сознания DPI. Попробуйте переключиться на 100% масштабирование шрифта и посмотреть, как поведение, как и следовало ожидать. –
Это уже при 100% масштабировании шрифта. Странно, если я тестирую цвет в «Блокноте», он может обнаружить его правильно. Однако в игре он возвращает другое значение, чем ожидалось. – user1725266
Вы не можете считывать значения пикселей таким образом, если визуализация визуализируется с использованием библиотеки DirectX или OpenGL. – IInspectable