2017-02-08 38 views
0

Я пытаюсь прочитать пиксель из внешней программы, а затем получить его цвета 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(); 
     } 
    } 
} 
+0

Очень вероятно, что это до уровня сознания DPI. Попробуйте переключиться на 100% масштабирование шрифта и посмотреть, как поведение, как и следовало ожидать. –

+0

Это уже при 100% масштабировании шрифта. Странно, если я тестирую цвет в «Блокноте», он может обнаружить его правильно. Однако в игре он возвращает другое значение, чем ожидалось. – user1725266

+0

Вы не можете считывать значения пикселей таким образом, если визуализация визуализируется с использованием библиотеки DirectX или OpenGL. – IInspectable

ответ

1

Эти симптомы соответствуют вашей системе, используя шрифт масштабирования не 100% и го e процесс не распознается DPI. Таким образом, процесс подлежит виртуализации DPI.