GetPixel RCL_INVALID



  • Hallo zusammen

    Ich versuchen von einem Fenster einen Pixel einzulesen und dessen Farbe zu bestimmen.
    Hört sich eigentlich ganz einfach an, jedoch ich bekomm es einfach nicht hin.

    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
            HWND Handle = FindWindow(NULL, "Form1");   //fenster suchen
            COLORREF RGBColor;
            BYTE ColorR;
            BYTE ColorG;
            BYTE ColorB;
            POINT Point;
    
            Point.x = 100;
            Point.y = 100;
    
            Point = ClientToScreen(Point);                  //koordinaten konvertieren
    
            if(Handle)
            {
                    HDC dc = GetWindowDC(Handle);
                    RGBColor = GetPixel(dc, Point.x, Point.y);
                    if(RGBColor != CLR_INVALID)
                    {
                            ColorR = GetRValue(RGBColor);   //wird nie erreicht
                            ColorG = GetGValue(RGBColor);
                            ColorB = GetBValue(RGBColor);
                    }
            }
    }
    

    Was mir bisher auch nicht ganz klar ist, ob ich die Koordinaten konvertieren muß oder nicht? ES funktioniert beides nicht.
    Ich bekomme für GRBColor immer einen Wert von 4294967295UL (0xFFFFFFFF) welches anscheinend CLR_INVALID ist.

    Vielen dank.
    MfG Stephan



  • If the pixel is outside of the current clipping region, the return value is CLR_INVALID.



  • Hallo zusammen
    @....

    Kannst du mir bitte mal erklären was das nun genau für mich bedeutet, bzw was mach ich falsch oder was muß ich anderst machen.
    Habe leider nicht wirklich Ahnung von WinAPI.

    MfG Stephan



  • Das heißt, dass die Pixelangaben falsch sind.

    Ich verstehe nicht ganz was ClientToScreen bringen soll, ich schätze daran liegt's.



  • nimm doch zum test mal x = 1 und y = 1 und lass die konvertierung weg.



  • Hallo zusammen

    Ob ich mit ClientToScreen arbeite oder ohne macht keinen unterschied.
    Wenn ich als Koordinate x = 1, y = 1 nehme habe ich leider auch kein anderes Ergebnis.

    MfG Stephan



  • Was sagt denn dein Debugger?

    - Ist Handle gültig? (springt er überhaupt in die if-Verzweigung?)
    - Ist dc gültig? (liefert GetPixel vielleicht deshalb Müll?)



  • Hallo zusammen

    Also das Handle ist gültige (ungleich NULL).
    Ich vermute, daß das dc aus gültig ist, da es auch ungleich NULL ist.

    Das erste if wird durchlaufen, jedoch das zweite nicht.

    MfG Stephan



  • Hallo zusammen

    Hat den keiner mehr eine Idee?
    Verwende BCB6.0 Pro unter W2K bzw XP Pro.

    MfG Stephan



  • Habe ich das richtig verstanden, dass nach

    HDC dc = GetWindowDC(Handle);
    

    dc ungleich NULL ist, aber

    RGBColor = GetPixel(dc, 1, 1);
    

    trotzdem CLR_INVALID zurückliefert?!



  • Hallo zusammen

    @flenders
    Das hast Du genau richtig verstanden.

    MfG Stephan



  • hi. mal eine zwischenfrage. ist CLR_INVALID nicht das selbe wie RGB(255, 255, 255) also weiß?



  • Hallo zusammen

    @zwischenfrage
    Habe keine Ahnung ob dies so ist, habe allerdings nichts weisses in meinem Formular.

    MfG Stephan



  • Stephan schrieb:

    Habe keine Ahnung ob dies so ist, habe allerdings nichts weisses in meinem Formular.

    Habe das gerade mal mit 1/1 getestet, und dort ist aufgrund des "3D-Rahmens" tatsächlich weiß - allerdings geht er bei mir auch dann in if(RGBColor != CLR_INVALID) hinein 😉



  • Hallo zusammen

    @flenders
    Ok, das mit dem 3D Rahmen ist nachvollziehbar, jedoch ich kann eingeben was für Koordinaten ich will, und bekomme dann immer Weiß.

    MfG Stephan



  • Dann scheint dein Fehler wo anders zu liegen, denn bei mir funktioniert der Code 😉



  • Hallo.
    Konnte es auch nicht glauben das dein Code nicht funktioniert. Ich musste dann aber feststellen das ich es auch nicht hinkriege. 😞

    #include <windows.h>
    
    int main()
    {
    	HWND hWnd = FindWindow(NULL, "Form1");
    
    	if(hWnd == NULL)
    	{
    		MessageBox(NULL, "Kein Fenster gefunden!", NULL, MB_OK);
    		return 0;
    	}
    
    	HDC hDC = GetWindowDC(hWnd);
    
    	if(hDC == NULL)
    	{
    		MessageBox(NULL, "Fehler bei GetWindowDC", NULL, MB_OK);
    		return 0;
    	}
    
    	COLORREF color = GetPixel(hDC, 1, 1);
    
    	if(color == CLR_INVALID)
    	{
    		MessageBox(NULL, "Fehler bei GetPixel", NULL, MB_OK);
    		return 0;
    	}
    }
    

    Bei mir endet das immer in "Fehler bei GetPixel". 😞



  • Ah doch, funktioniert. Das Fenster darf nur nicht verdeckt sein.



  • Ich hab die Logik dahinter aber noch nicht verstanden. Es kommt irgendwie immer darauf an wo das Fenster ist. Wenn ich es zu weit nach unten positioniere (Taskleiste) dann kommt der Fehler bei GetPixel, obwohl sagen wir mal 100 Pixel in der Höhe zu sehen sind. Schiebe ich es etwas weiter rauf, funktioniert es wieder.

    Hat bestimmt was mit dieser Clipping Region zu tun.



  • Ach sorry das ich hier soviel scheisse schreibe. 😃
    Ich hatte aus versehen statt x = 1 und y = 1 gerade x = 100 und y = 100 ausprobiert. Also vergeßt den letzten Beitrag.


Anmelden zum Antworten