Pixel Color von aktuellen Mouse-Cursor auslesen
-
Hallo,
ich versuche gerade mithilfe der aktuellen Mouse-Koordinaten die Farbe eines Pixels herauszufinden, habe aber damit Probleme.
Wichtig dabei die Koordinaten von dem aktiven Window zu bekommen und nicht die vom Desktop.
Zuerst habe ich einfach probiert mit AU3_spy.exe (zeigt die Koordinaten des aktiven Fensters an), wenn ich allerdings diese mit GetPixel(hdc,x,y) dann aufrufen möchte, kommt eine andere Farbe, als die, die mir AU3_spy.exe ausgibt.Mit welcher Funktion kriege ich die aktuellen Mauskoordinaten aus dem aktiven Fenster womit ich dann die Farbe mit GetPixel() auslesen kann?
Gruß
-
Welches hdc hast du denn benutzt?
Mit WindowFromPoint das Fenster holen, mit GetDC das DC, dann die Koordinaten des Fensters von den Mauskoordinaten abrechnen und GetPixel benutzen geht nicht?
Ich hatte mal das Problem, dass ich einen Screenshot machen wollten, aber das Fenster von OpenGL (bei DirectX wahrscheinlich auch) gerendert wird und deshalb das DC leer ist. Ich musste die OpenGL-Funktionen statt DCs benutzen. Ich kenne keine allgemeine Funktion, die den Bildschirm kopiert wie wenn man "Druck" drückt. Obwohl man das benutzen könnte und dann die Zwischenablage ausließt, aber das könnte langsam sein.
-
xxx =FindWindow(_T("xxx"), _T("xxxx") xxxhdc = GetDC(xxx); while(true) { if(GetAsyncKeyState(VK_F10)) // { POINT p; GetCursorPos(&p); printf("Color of x%d,y:%d = %x",p.x,p.y,GetPixel(xxxhdc,p.x,p.y)); while(GetAsyncKeyState(VK_F10)) { } } }
Also so in etwa habe ich das. Funktioniert natürlich auch, jedoch nur mit den Position vom Desktop aus und nicht vom aktiven Fenster.
Was muss ich nun anstatt GetCursorPos() verwenden um die Positionen vom aktiven Fenster zu bekommen?
-
RECT rect; GetWindowRect(xxx, &rect); ... GetPixel(xxxhdc, p.x - rect.left, p.y - rect.top);
Irgendwie sowas.
-
Per CreateDC() oder GetDC(0) einen DC für den ganzen Bildschirm holen, GetCursorPos() und GetPixel() und fertig...
-
nwp3 schrieb:
RECT rect; GetWindowRect(xxx, &rect); ... GetPixel(xxxhdc, p.x - rect.left, p.y - rect.top);
Irgendwie sowas.
ja das hat so geklappt, allerdings stimmt da irgendwas nicht.
er zeigt mir jetzt zwar die richtigen koordinaten an, allerdings
stimmt die farbe nicht ganz.
http://img341.imageshack.us/img341/5531/56238219.jpgDa sieht man, die Koordinaten stimmen überein, die Farben aber nicht.
Der Maus-Cursor war über einem komplett schwarzen Pixel, also stimmt das von
der AU3_spy.exe, von meinem Programm aber nicht.
Weiß jemand wieso?hier nochmal mein code:
xxxHandle = FindWindow(_T("xxx"), _T("xxx")); xxxhdc = GetDC(xxxHandle); while(true) { if(GetAsyncKeyState(VK_F10)) { POINT p; RECT rect; GetWindowRect(xxxHandle, &rect); GetCursorPos(&p); printf("\nColor of x%d,y:%d = %x",p.x-rect.left,p.y- rect.top,GetPixel(xxxhdc,p.x-rect.left,p.y - rect.top)); while(GetAsyncKeyState(VK_F10)) {} } }
-
falls es jemanden interessiert... Das Tool au3_spy.exe und andere Tools fangen mit Pixel 0,0 schon im Fensterahmen an. Wenn man aber bei GetPixel(0,0) einträgt dann wird einem der 1. Pixel unterhalb des Fensterrahmens angezeigt.
Habe in meinem Fall somit nochmal eine Pixel-Verschiebung von x:8,y:30.
Mein Problem ist somit also behoben.POINT p; RECT rect; GetWindowRect(xxxHandle, &rect); GetCursorPos(&p); printf("\nColor of x%d,y:%d = %x",p.x-rect.left-8,p.y- rect.top-30,GetPixel(xxxhdc,p.x-rect.left-8,p.y - rect.top-30));
Gruß
-
Mit welcher Funktion kriege ich die aktuellen Mauskoordinaten aus dem aktiven Fenster womit ich dann die Farbe mit GetPixel() auslesen kann?
Ansatz Lösung:
#include <windows.h> #define ID_TIMER 1 void FindWindowSize (int *, int *) ; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Pixel Color") ; HWND hwnd ; int cxWindow, cyWindow ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode!"), szAppName, MB_ICONERROR) ; return 0 ; } FindWindowSize (&cxWindow, &cyWindow) ; hwnd = CreateWindow (szAppName, TEXT ("Pixel Color"), WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_BORDER, CW_USEDEFAULT, CW_USEDEFAULT, cxWindow, cyWindow, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } void FindWindowSize (int * pcxWindow, int * pcyWindow) { HDC hdcScreen ; TEXTMETRIC tm ; hdcScreen = CreateIC (TEXT ("DISPLAY"), NULL, NULL, NULL) ; GetTextMetrics (hdcScreen, &tm) ; DeleteDC (hdcScreen) ; * pcxWindow = 2 * GetSystemMetrics (SM_CXBORDER) + 12 * tm.tmAveCharWidth ; * pcyWindow = 2 * GetSystemMetrics (SM_CYBORDER) + GetSystemMetrics (SM_CYCAPTION) + 2 * tm.tmHeight ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static COLORREF cr, crLast ; static HDC hdcScreen ; HDC hdc ; PAINTSTRUCT ps ; POINT pt ; RECT rc ; TCHAR szBuffer [16] ; switch (message) { case WM_CREATE: hdcScreen = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ; SetTimer (hwnd, ID_TIMER, 100, NULL) ; return 0 ; case WM_TIMER: GetCursorPos (&pt) ; cr = GetPixel (hdcScreen, pt.x, pt.y) ; if (cr != crLast) { crLast = cr ; InvalidateRect (hwnd, NULL, FALSE) ; } return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rc) ; wsprintf (szBuffer, TEXT (" %02X %02X %02X "), GetRValue (cr), GetGValue (cr), GetBValue (cr)) ; DrawText (hdc, szBuffer, -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: DeleteDC (hdcScreen) ; KillTimer (hwnd, ID_TIMER) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }