bitblt versuch



  • dieser codeausschnitt habe ich von msdn, nur habe ich es ein bisschen verändert.
    ursprünglich war das ein screen capture, d.h. source dc war es der desktop und destination dc aktuelles testprogramm1. ich ändere es so, dass source dc ist nur aktuelles testprogramm1, und destination dc ist andere testprogramm2. bei urspünglich screen capture funktioniert es, nur bei modifizierte 2. variante nicht. es soll das aktuelle testprogramm1 mithilfe bitblt gecaptured werden und in testprogamm2 angezeigt werden.

    int CaptureAnImage(HWND hWnd)
    {
        HDC hdcScreen;
        HDC hdcWindow;
        HDC hdcMemDC = NULL;
    	HWND dest = FindWindow(NULL, L"TestDC");
    
        // Retrieve the handle to a display device context for the client 
        // area of the window. 
        hdcScreen = GetDC(hWnd);
        hdcWindow = GetDC(dest);
    
        // Create a compatible DC which is used in a BitBlt from the window DC
        hdcMemDC = CreateCompatibleDC(hdcWindow); 
    
        if(!hdcMemDC)
        {
            MessageBox(hWnd, L"CreateCompatibleDC has failed",L"Failed", MB_OK);
            goto done;
        }
    
        // Get the client area for size calculation
        RECT rcClient;
        GetClientRect(hWnd, &rcClient);
    
        //This is the best stretch mode
        // SetStretchBltMode(hdcWindow,HALFTONE);
    
        //The source DC is the entire screen and the destination DC is the current window (HWND)
        if(!BitBlt(hdcWindow,
                   0, 0,
                   rcClient.right, rcClient.bottom,
                   hdcScreen,
                   0, 0,
                   // GetSystemMetrics (SM_CXSCREEN),
                   // GetSystemMetrics (SM_CYSCREEN),
                   SRCCOPY))
        {
            MessageBox(hWnd, L"BitBlt has failed",L"Failed", MB_OK);
            goto done;
        }
    	UpdateWindow(dest);
    
        //Clean up
    done:
        DeleteObject(hdcMemDC);
        ReleaseDC(NULL,hdcScreen);
        ReleaseDC(hWnd,hdcWindow);
    
        return 0;
    }
    


  • bitblt_problem schrieb:

    ...
       	HWND dest = FindWindow(NULL, L"TestDC");
    ...
    

    Steht da was sinnvolles drin? Wird das Fenster gefunden?

    Greetz



  • Ja, das fenster wurde gefunden. es ist ein button drin.

    so hat es kein problem mit bitblt, ist aber nicht so gewollt.

    hdcScreen = GetDC(dest);
     hdcWindow = GetDC(hWnd);
    

    so hat es ein problem mit bitblt, nix wird angezeigt, anzeigen des bildes ist hier gewollt.

    hdcScreen = GetDC(hWnd);
     hdcWindow = GetDC(dest);
    


  • Hi,

    ich habe da bei FindWindow ein ungutes Gefühl. Da keine Fensterklasse angegeben wird, kann das jedes Fenster sein mit dem Caption. Ohne Fensterklasse laüft die Funktion, bin mir aber nicht sicher, alle Fenster durch und sobald ein Fenster mit dem Text gefunden wird kehrt die Funktion zurck. Veruch mal über Spy++ die Fenterklasse zu finden.

    Gruß



  • Dein hdcScreen enthält einen DC von einem übergebenen Fenster (hWnd):

    hdcScreen = GetDC(hWnd);
    ...
    ReleaseDC(NULL,hdcScreen);
    

    ändern in:

    hdcScreen = GetDC(NULL);
    ...
    ReleaseDC(NULL,hdcScreen);
    

    Und schmeiss das UpdateWindow(dest) raus ...


Anmelden zum Antworten