V
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);
}