Da es auf meine Frage zu Switchdesktop keine Antowrt zu geben scheint, hier mal meine derzeitige Funktion um ein Snapshot eines Fensters anzufertigen:
<pre>
if not SetForegroundwindow(wininfo.win) then
idPRint('Fehler bei SetForegroundwindow ('+filen+'): '+lastWinError)
else begin
if not GetWindowRect(wininfo.win, r) then
idPRint('Fehler bei GetWindowRect ('+filen+'): '+lastWinError)
else begin
r.Bottom := r.Bottom-r.Top; r.Top := 0;
r.Right := r.Right-r.Left; r.Left := 0;
if r.Bottom <= r.Top+50 then r.Bottom := r.Top+600;
if r.Right <= r.Left+50 then r.Right := r.Left+800;
if not SetWindowPos(wininfo.win, 0, 0, 0, r.Right, r.Bottom, SWP_SHOWWINDOW) then
idPRint('Fehler bei SetWindowPos ('+filen+'): '+lastWinError)
else begin
sleep(200);
DC := GetWindowDc(winInfo.win);
if dc = 0 then
idPRint('Fehler bei GetWindowDc ('+filen+') Fehler(?): '+lastWinError)
else begin
bmp := TBitmap.Create;
try
bmp.Width := r.Right - r.Left;
bmp.Height := r.Bottom - r.Top;
if not BitBlt(bmp.Canvas.Handle, 0, 0, r.Right , r.Right, DC, 0, 0, SRCCopy) then
idPRint('Fehler bei BitBlt ('+filen+'): '+lastWinError)
else begin
jpg := TJPEGImage.Create;
try
jpg.Performance := jpBestQuality;
jpg.CompressionQuality := 75;
jpg.Assign(Bmp);
jpg.SaveToFile(fileDir+filen+'.jpg');
result := (fileDir+filen+'.jpg');
finally jpg.Free; end;
end;
finally bmp.Free; ReleaseDc(0, dc); end;
end;
end;
end;
end;
</pre> Ist der Desktop nicht im Vordergrund hapert es schon an SetForegroundWindow (Das System kann die Angegebene Datei nicht finden!). Gibt es nicht eine andere Möglichkeit? Kann ich das Fenster nicht irgendwie veranlassen sich gleich in eine Bitmap oder ähnliches statt auf den Screen zu zeichnen? Brauche dringend diese Funktion, einige Programme mucken schon, wenn sie unter dem Systemkontext laufen, da mein "Testrechner" ein Terminalserver beim Kunden einige hundert Kilometer entfernt ist bin ich im wahrsten Sinne des Wortes Blind. Btw, gibt es eine Möglichkeit auf einem Terminalserver zum testen etwas unter dem Systemkonto aber auf dem aktuellen Desktop (Session) zu starten? at xxx cmd.exe funktioniert nicht, der Job wird angezeigt und verschwindet auch zur richtigen Zeit auf dem Desktop erscheint aber nichts....
Danke für jeden Tip
Karsten
<pre>
if not SetForegroundwindow(wininfo.win) then
idPRint('Fehler bei SetForegroundwindow ('+filen+'): '+lastWinError)
else begin
if not GetWindowRect(wininfo.win, r) then
idPRint('Fehler bei GetWindowRect ('+filen+'): '+lastWinError)
else begin
r.Bottom := r.Bottom-r.Top; r.Top := 0;
r.Right := r.Right-r.Left; r.Left := 0;
if r.Bottom <= r.Top+50 then r.Bottom := r.Top+600;
if r.Right <= r.Left+50 then r.Right := r.Left+800;
if not SetWindowPos(wininfo.win, 0, 0, 0, r.Right, r.Bottom, SWP_SHOWWINDOW) then
idPRint('Fehler bei SetWindowPos ('+filen+'): '+lastWinError)
else begin
sleep(200);
DC := GetWindowDc(winInfo.win);
if dc = 0 then
idPRint('Fehler bei GetWindowDc ('+filen+') Fehler(?): '+lastWinError)
else begin
bmp := TBitmap.Create;
try
bmp.Width := r.Right - r.Left;
bmp.Height := r.Bottom - r.Top;
if not BitBlt(bmp.Canvas.Handle, 0, 0, r.Right , r.Right, DC, 0, 0, SRCCopy) then
idPRint('Fehler bei BitBlt ('+filen+'): '+lastWinError)
else begin
jpg := TJPEGImage.Create;
try
jpg.Performance := jpBestQuality;
jpg.CompressionQuality := 75;
jpg.Assign(Bmp);
jpg.SaveToFile(fileDir+filen+'.jpg');
result := (fileDir+filen+'.jpg');
finally jpg.Free; end;
end;
finally bmp.Free; ReleaseDc(0, dc); end;
end;
end;
end;
end;
</pre> Ist der Desktop nicht im Vordergrund hapert es schon an SetForegroundWindow (Das System kann die Angegebene Datei nicht finden!). Gibt es nicht eine andere Möglichkeit? Kann ich das Fenster nicht irgendwie veranlassen sich gleich in eine Bitmap oder ähnliches statt auf den Screen zu zeichnen? Brauche dringend diese Funktion, einige Programme mucken schon, wenn sie unter dem Systemkontext laufen, da mein "Testrechner" ein Terminalserver beim Kunden einige hundert Kilometer entfernt ist bin ich im wahrsten Sinne des Wortes Blind. Btw, gibt es eine Möglichkeit auf einem Terminalserver zum testen etwas unter dem Systemkonto aber auf dem aktuellen Desktop (Session) zu starten? at xxx cmd.exe funktioniert nicht, der Job wird angezeigt und verschwindet auch zur richtigen Zeit auf dem Desktop erscheint aber nichts....
Danke für jeden Tip
Karsten