Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Per Mausklick Screenshot von Fenstern machen (https://www.delphipraxis.net/161562-per-mausklick-screenshot-von-fenstern-machen.html)

Stread 8. Jul 2011 22:10

Per Mausklick Screenshot von Fenstern machen
 
Hi,
ich habe ein Programm welches Screenshots vom Bildschirm macht und in jpegs speichert.
Nun möchte ich aber gerne dass es (nach drücken eines Buttons) möglich ist wenn ich mit der Maus auf ein anderes Fenster klicke der Screenshot nur von diesem Fenster gemacht wird.
Ich brauche von dem Fenster dann ja den handle, die ID oder sowas. Wie kann ich sowas per Mausklick auslesen?
Kann ich diese Information dann gleich weiterverarbeiten um nur davon den Screenshot zu erstellen oder muss ich mir dann erst noch schauen auf welchen Pixeln das Fenster steht?
Danke

sx2008 9. Jul 2011 00:24

AW: Per Mausklick Screenshot von Fenstern machen
 
MSDN-Library durchsuchenGetForegroundWindow() - Handle des Fensters im Vordergrund holen.

Stread 9. Jul 2011 16:40

AW: Per Mausklick Screenshot von Fenstern machen
 
Und wie funktioniert das in Verbindung mit dem Mausklick auf das Fenster der anderen Anwendung?
Geht das überhaupt so wie ich es mir vorstelle?

jaenicke 9. Jul 2011 17:37

AW: Per Mausklick Screenshot von Fenstern machen
 
Du könntest mit SetWindowsHookEx und WH_MOUSE_LL einen Hook setzen um die Maustastendrücke mitzubekommen.

Oder du kannst mit RegisterHotkey einen Tasten-Hotkey dafür definieren.

jfheins 9. Jul 2011 17:43

AW: Per Mausklick Screenshot von Fenstern machen
 
Wenn du bei einem Button die Maustaste drückst, gedrückt hältst und sie dann auf dem anderen Fenster loslässt, bekommst du im Button das trotzdem mit und kannst anhand der Koordinaten das Fenster ermitteln.
Ganz ohne Hook :-)

Das erstellen des Screenshots geht dann mit http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx relativ einfach ;)

Stread 10. Jul 2011 21:01

AW: Per Mausklick Screenshot von Fenstern machen
 
Das mit der Maustaste gedrückt lassen hört sich gut an.
Allerdings schaffe ich es nicht wenn ich den Button drücke und die Maus auf einem anderen Fenster wieder loslasse, den Screenshot davon zu bekommen.

Aber den von anderen Fenstern nicht.
Es wird anscheinend das Handle des Buttons genommen.
Wenn ich den Code in einen Timer dann geht es.
Das wäre dann aber ohne Maus ziehen.

jfheins: Ist dein Link nicht nur zum Drucken gedacht?


Delphi-Quellcode:
function FormularScreenShot(Bmp: TBitmap; h : hWnd): Boolean;
var
  Rec: TRect;
  iWidth, iHeight: Integer;
begin
  with Bmp do try
    GetWindowRect(h, Rec);
    iWidth := Rec.Right - Rec.Left;
    iHeight := Rec.Bottom - Rec.Top;
    Width := iWidth;
    Height := iHeight;
    BitBlt(Canvas.Handle, 0, 0, iWidth, iHeight, GetWindowDC(h), 0, 0, SRCCOPY);
     Result := True;
  finally
    ReleaseDC(h, GetWindowDC(h));
  end;
end;

//Liefert Bild von dem Button
procedure TForm1.Button2Click(Sender: TObject);
var h :HWND;
begin
h:=WindowFromPoint(Mouse.CursorPos);
 FormularScreenShot(Image1.Picture.Bitmap,h);
 Image1.Repaint;
end;

jaenicke 10. Jul 2011 22:21

AW: Per Mausklick Screenshot von Fenstern machen
 
Wie wäre es mit OnMouseUp? Da bekommst du die Koordinaten gleich frei Haus geliefert...

Stread 11. Jul 2011 11:47

AW: Per Mausklick Screenshot von Fenstern machen
 
Ups :oops: An MouseUp habe ich gar nicht gedacht.
Es funktioniert jetzt so lala.

1. Problem
Fenster und die Taskleiste sind Schwarz wo die Aero Effekte sein sollten.
http://s1.directupload.net/file/d/2582/nedfq7mz_jpg.htm
http://www.directupload.net/index.php?mode=upload
http://s7.directupload.net/file/d/2582/7ifnaj7p_jpg.htm
http://s1.directupload.net/file/d/2582/vub7avod_jpg.htm

2. Problem
Der Header des Fensters wird anscheinend nicht aktualisiert.
Oben zeigt der VLC Player immer noch das gleiche Lied an während unten schon das neue läuft. Oder er zeigt es erst gar nicht an.
http://s1.directupload.net/file/d/2582/gzqw2wj4_jpg.htm
http://s7.directupload.net/file/d/2582/6cq9zduf_jpg.htm
http://s1.directupload.net/file/d/2582/ag22zssz_jpg.htm


Ich werde wohl eher die Koordianten des Fensters abfragen, dann einen Screenshot vom ganzen Bildschirm erstellen und am Ende das Bild irgendwie freistellen.

Edit: Wie gesagt habe ich es jetzt über die Koordinaten gelöst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz