Probleme mit GetPixel



  • Hi,

    ich möchte einen Pixel aus einem fremden Fenster auslesen und habe mir folgendes zusammengebastelt:

    #include <Windows.h> 
    #include <Tchar.h> 
    #include <vector> 
    #include <Iostream>
    #include <winuser.h> 
    #include <winable.h> 
    
    using namespace std;
    HDC myDisplayCanvas;
    
    HWND myWindowHandler;
    
    struct Window 
    { 
    	basic_string<TCHAR> title; 
    	HWND handle; 
    }; 
    
    vector<Window> windows; 
    
    // Callback fr EnumWindows. Wird aufgerufen fr jedes Fenster 
    BOOL CALLBACK EnumWindowsProc (::HWND hwnd, ::LPARAM lParam) 
    { 
    	// Kein Fenster 
    	if (!IsWindow (hwnd)) 
    		return (TRUE); 
    
    	// nur sichtbare Fenster auflisten 
    	if (!IsWindowVisible (hwnd)) 
    		return (TRUE); 
    
    	// Fensterberschrift ermitteln 
    	TCHAR title[256]; 
    	if (!GetWindowText (hwnd, title, sizeof (title) / sizeof (title[0]))) 
    		return (TRUE); 
    
    	// neues Fenster hinzufgen... 
    	Window wnd; 
    	wnd.handle      = hwnd; 
    	wnd.title       = title; 
    	windows.push_back (wnd); 
    
    	return (TRUE);
    }
    
    // Listet Fenster auf und regelt Auswahl eines Fensters 
    HWND select_window (void) 
    { 
    	// Alle Fenster auflisten 
    	EnumWindows (EnumWindowsProc, 0); 
    
    	// Liste aller Fenster ausgeben. 
    	vector<Window>::iterator window_it = windows.begin (); 
    	for (int i = 0; window_it != windows.end (); ++ window_it, ++ i) 
    		_tprintf (_T ("%d : %s\n"), i, window_it->title.c_str ()); 
    
    	// Auswahl des Fensters & Prüfung, ob Auswahl im Gültigskeitsbereich liegt 
    	unsigned int choice = 0; 
    	do 
    	{ 
    		cout << "\nAuf welches Fenster soll aufgeschaltet werden: \n"; 
    		cin >> choice; 
    
    	} while (choice < 0 || choice >= windows.size ()); 
    
    	// ausgewählte Fensterhandle zurckgeben 
    	return (windows[choice].handle); 
    } 
    
    int main() {
    
    	myWindowHandler = select_window();
    	// Fenster in Originalgröße anzeigen
    	ShowWindow(myWindowHandler, SW_RESTORE);
    	// Fenster in den Vordergrund holenc
    	SetForegroundWindow(myWindowHandler);
    	// Tastaturfokus auf Fenster setzen
    	SetFocus(myWindowHandler);
    
    	myDisplayCanvas = GetDC(myWindowHandler);
    
    	while (true)
    	{
    
    		COLORREF color = GetPixel(myDisplayCanvas ,120,120);
    		cout << color << "\n";
    
    	}
    
    	return 0;
    }
    

    Getestet habe ich dies mit verschiedenen Programmen. (z.B Editor, Paint etc.)

    Das Fenster Rückt wie gewünscht in den Vordergrund und erhält den Focus.
    Aber als Farbe erhalte ich IMMER nur 16777215.

    Was mache ich falsch?



  • kannst ja mal kucken ob der zurückgegebene wert von GetPixel() == CLR_INVALID
    ist. wenn dem so ist, schreibt die MSDN dazu.

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



  • Hallo,

    passen die Koordinaten auch zu diesem Fenster?
    ClientToScreen oder ScreenToClient mappen die Koordinaten entsprechend 😉



  • Schau doch mal einfach in der MSDN nach, dann siehst du das COLORREF ein Hexwert
    ist, den du noch in RGB zerlegen musst.

    http://msdn.microsoft.com/en-us/library/ms532655(VS.85).aspx



  • Also wenn ich

    myDisplayCanvas = GetDC(0);
    

    verwende dann gehts 🙄

    Hallo,

    passen die Koordinaten auch zu diesem Fenster?
    ClientToScreen oder ScreenToClient mappen die Koordinaten entsprechend

    Das habe ich noch nicht getestet, aber es funktioniert ja auch bei Fenster die Vollbild sind nicht. (Nur mit der oben angegeben Methode, die den Desktop aufnimmt (und somit jedes fenster)). Es funktioniert mit GetDC(0); sogar bei Direct-X Spielen. 😮

    Hat sonst noch Jemand eine Idee warum meine auf Fenster bezogene selektive Version nicht funktioniet?



  • 16777215 ist Weiss. CLR_INVALID hat einen anderen Wert (vermutlich 0xFFFFFFFF).
    Bist du sicher dass die Farbe dort nicht einfach immer Weiss ist?
    Hast du versucht mal die Werte von "myDisplayCanvas" und "myWindowHandler" auszugeben?

    BTW: es ist ein Window-Handle (ohne R hinten, "Handler" bedeutet was ganz anderes), und DC heisst "Device Context" nicht "Display Canvas".


Anmelden zum Antworten