Hallo,
wir haben unten stehend Funktion zum generieren eines Screenshots von einem aktiven beliebigem
Programm.
Dazu haben wir in einem Hintergrundprogramm mit RegisterHotKey(fmain.Handle, ID3, MOD_ALT, vk_f10); uns die
Screenshot Funktion auf eine Tastenkombi gelegt und können somit ein Bitmap vom aktiven Fenster durchführen und dann als Bild speichern, drucken oder in die Zwischenablage kopieren.
Folgendes passiert mit dem Titel z.b reproduzierbar mit Notepad, Word, Excel usw.
1.Notepad öffnen
2.Inhalt = Test
3.Datei speichern als test.txt. Damit steht in der Titelteile "test.txt - Editor"
4.Inhalt ändern auf Test2
5.Datei speichern als test2.txt. Damit steht in der Titelteile "test2.txt - Editor"
6.Nun den
Screenshot erstellen und abspeichern oder per Zwischenablage in Paint einfügen
Nun steht in dem
Screenshot in der Titelzeile "test.txt - Editor"
Unter der Titelzeile also im Textbereich wird aber das korrekte im
Screenshot angezeigt.
Wird zwischen Punkt 5 und 6 der Editor minimiert und wieder angezeigt passiert folgendes
- Korrekter Titel ist im
Screenshot
- Titelzeile fehlt komplett im
Screenshot
Im Anhang der Quellcode und das
Programm.
Frage wäre wo der Fehler ist oder es eine bessere Lösung zum erstellen des
Screenshot gibt.
Code:
const ID3 = $FD;
procedure
ScreenShot(activeWindow: bool; destBitmap : TBitmap) ;
var
w,h : integer;
DC : HDC;
hWin : Cardinal;
r : TRect;
ProcessID : THandle;
begin
if activeWindow then begin
hWin := GetForegroundWindow;
dc := GetWindowDC(hWin) ;
GetWindowRect(hWin,r) ;
w := r.Right - r.Left;
h := r.Bottom - r.Top;
end else begin
hWin := GetDesktopWindow;
dc := GetDC(hWin) ;
w := GetDeviceCaps (
DC, HORZRES) ;
h := GetDeviceCaps (
DC, VERTRES) ;
end;
try
destBitmap.Width := w;
destBitmap.Height := h;
BitBlt(destBitmap.Canvas.Handle,
0,
0,
destBitmap.Width,
destBitmap.Height,
DC,
0,
0,
SRCCOPY) ;
finally
ReleaseDC(hWin,
DC) ;
end;
end;
procedure Tfmain.WMHotKey(Var Msg: TMessage);
var mybitmap: TBitmap;
d : TDVorschau;
clipboard:Tclipboard;
begin
case Msg. WParam of
id3:begin
mybitmap := TBitmap.Create;
Screenshot(true,mybitmap);
clipBoard := TClipBoard.Create;
Clipboard.Assign(mybitmap);
ClipBoard.free;
mybitmap.free;
end;
end;