Über Fenster-Pixel iterieren



  • Hallo,

    ich möchte die Pixel eines beliebigen Fensters mit einem RGB Wert multiplizieren. Ich müsste also zunächst den aktuellen Hintergrund in ein array laden und anschließend über jedes Pixel iterieren.

    Welche API Funktionen brauche ich um das zu realisieren. Ich bin u.a. auf BitBlt zum kopieren gestoßen, aber wie komme ich an die Elemente heran?



  • Ich habe hier was rumliegen... Es geht aber erst ab WinXP ( #define _WIN32_WINNT 0x0501 ).

    HWND hWndApp = FindWindow("CLASSNAME",0); // das Fensterhandle bspw. per FindWindow
    if(!hWndApp)
    	return 0;
    bool bMinimized = (GetWindowLongPtr(hWndApp,GWL_STYLE) & WS_MINIMIZE);//IsMinimized(hWndApp);
    
    if(bMinimized)
    {
    	ShowWindow(hWndApp,SW_SHOW);
    	ForceForegroundWindow(hWndApp); // siehe unten
    	int iCounter = 0;
    	while(GetForegroundWindow()!=hWndApp && (++iCounter)<100)// max 5 sec warten
    	{
    		Sleep(50);
    	}
    	ShowWindow(hWndApp,SW_RESTORE);
    	UpdateWindow(hWndApp);
    }
    else
    {
        ForceForegroundWindow(hWndApp);
    }
    RECT rc;
    GetWindowRect(hWndApp, &rc);
    
    HDC hdcScreen = GetDC(hWndApp);
    HDC hdc = CreateCompatibleDC(hdcScreen);
    
    // hier ein neues Bitmap (am Besten mit CreateDibSection) mit der Größe (Größe rc.right-rc.left,rc.bottom-rc.top) anlegen 
    // und in den DC einwählen
    HGDIOBJ hbOld = SelectObject(hdc, BITMAPHANDLE);
    PrintWindow(hWndApp, hdc, 0);
    SelectObject(hdc, hbOld);
    
    // Der Inhalt kann jetzt ausgewertet, in ein Array kopiert oder sonstwie
    // gespeichert werden.
    // Wie geschrieben sollte es am Besten ein device independent bitmap sein
    
    DeleteDC(hdc);
    ReleaseDC(NULL, hdcScreen);
    
    SetForegroundWindow(myHwnd); // eigenes Fenster wieder in den Vordergrund
    
    ..
    HWND ForceForegroundWindow(HWND hTo)
    {
        if(!hTo) return(NULL);
        HWND hFrom=GetForegroundWindow();
        if(!hFrom) {
            SetForegroundWindow(hTo);
            return(NULL);
        }
        if(hTo==hFrom)
            return(NULL);
        DWORD pid=GetWindowThreadProcessId(hFrom,0);
        if (_threadid==pid) {
            SetForegroundWindow(hTo);
            return(hFrom);
        }
        if(pid) {
            if(!AttachThreadInput(_threadid,pid,true))
                return(NULL);
            SetForegroundWindow(hTo);
            AttachThreadInput(_threadid,pid,false);
        }
        return(hFrom);
    }
    

Anmelden zum Antworten