Bitte bitte
Du solltest deinen Code allerdings noch um ein
Bitmap.Canvas.Lock
vor dem
PrintWindow
und ein
Bitmap.Canvas.Unlock
danach erweitern. Ansonsten kann es vorkommen, dass seltsame Effekte auftreten wie z.B., dass das Zielfenster unkontrolliert anfängt zu flackern, während der Screenshot erstellt wird.
PrintWindow ist eine sehr schlechte Lösung um Screen Shots zu erstellen.
Warum?
Weil es nur mit einem Fenster richtig funktioniert in dem auch alle dafür benötigten Messagen korrekt verarbeitet werden.
Wenn dem nicht so ist lass es lieber.
Die Messagen die du behandeln musst sind WM_PRINT, WM_PRINTCLIENT nur damit kannst du korrekt auf den bereitgestellten wParam
DC Zeichnen.
WM_PAINT sollte dann komplett ignoriert werden.
Verwende lieber etwa auf dieser Art.
Code:
BOOL CaptureScreen(HBITMAP& hBitmap)
{
HDC hDCScreen = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
const int cx = ::GetDeviceCaps(hDCScreen, HORZRES);
const int cy = ::GetDeviceCaps(hDCScreen, VERTRES);
HDC hDCMem = ::CreateCompatibleDC(hDCScreen);
hBitmap = ::CreateCompatibleBitmap(hDCScreen, cx, cy);
HBITMAP hBmpOld = (HBITMAP)::SelectObject(hDCMem, hBitmap);
// Note: CAPTUREBLT flag is required to capture layered windows
DWORD dwRop = SRCCOPY | CAPTUREBLT;
BOOL bRet = ::BitBlt(hDCMem, 0, 0, cx, cy, hDCScreen, 0, 0, dwRop);
::SelectObject(hDCMem, hBmpOld);
::DeleteDC(hDCMem);
::DeleteDC(hDCScreen);
return bRet;
}
Zitat:
Du kannst es ja mit FullWindow = False mal probieren.
Sollte kein Problem sein.. warum auch ob ich nun den gesamten Screen kopiere oder nur den Teil der unter meiner Anwendung liegt spielt absolut keine rolle.
Es bleibt sich gleich.
gruss