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 entsprechendDas 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".