2017-02-08 1 views
0

J'essaye de lire un pixel d'un programme externe et d'obtenir ensuite ses couleurs RVB. Cela fonctionne parfaitement chaque fois que je trouve l'emplacement avec la souris et extrait les couleurs de pixel. Cependant quand j'essaye de le faire d'un programme de console, les couleurs de RBG reviennent .. différemment que ce que j'attendais. Je crois que cela pourrait être un décalage manquant, donc chaque fois que je trouve l'emplacement avec ma souris, il utilise le pixel de mon écran et chaque fois que j'activerai le programme externe en utilisant la fonction ci-dessous.Des couleurs de pixels erronées sont lues à partir d'un programme externe, Offset nécessaire?

Il pourrait aussi s'agir d'un jeu, et il se dessine différemment, des conseils? Si j'essaie d'obtenir les couleurs de pixels du bloc-notes, cela fonctionne.

[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); 
    } 
} 

J'utilise la fonction suivante pour extraire les couleurs de pixels à partir d'un emplacement, cela est exécuté après que je suis fixé le programme en tant que fenêtre active (fonction ci-dessus):

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); 
     } 
    } 

programme Conole en cours d'exécution, cela renvoie les pixels X et y exact que Je l'ai dit, mais les couleurs reviennent au large:

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

Il est fort probable que cela soit dû à la sensibilisation de l'OMPI. Essayez de passer à la mise à l'échelle de la police à 100% et voyez si le comportement est le même que celui auquel vous vous attendez. –

+0

Il est déjà à 100% de mise à l'échelle des polices. Chose étrange, si je teste une couleur dans le Bloc-notes, il peut la détecter correctement. Cependant, dans un jeu, il renvoie une valeur différente de ce que j'attendais – user1725266

+0

Vous ne pouvez pas lire les valeurs de pixel de cette façon, si les visuels sont rendus en utilisant une bibliothèque comme DirectX ou OpenGL. – IInspectable

Répondre

1

Ces symptômes sont compatibles avec votre système en utilisant la police échelle autre que 100% et e Le processus n'est pas sensible au DPI. Ainsi, le processus est soumis à la virtualisation DPI.