AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Screenshot eines anderen Programmes mit wm_print
Thema durchsuchen
Ansicht
Themen-Optionen

Screenshot eines anderen Programmes mit wm_print

Ein Thema von SirThornberry · begonnen am 8. Jun 2006 · letzter Beitrag vom 15. Feb 2009
Antwort Antwort
Seite 2 von 3     12 3      
EWeiss
(Gast)

n/a Beiträge
 
#11

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 11:07
warum schickst du nicht einfach einen SendKey auf die Drucktaste.
und holst dir dann das bild aus der ablage.

Kannst dir dann den ganzen Code da oben sparen.

gruss Emil
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#12

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 11:17
Danke für die Info.
Dann muss aber sichergestellt sein, dass der Viewer das aktive Fenster ist. Ansonsten hole ich mir irgendwas anderes in die Zwischenablage.
Vielleicht müßte ich dann erst den Viewer als aktives Fenster machen und dann könnte es klappen. Aber dazu fehlen mit wiederum die Windowsfunktionen. Jedenfalls kenne ich diese nicht.
Matthias
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 11:19
Zitat von zeras:
Danke für die Info.
Dann muss aber sichergestellt sein, dass der Viewer das aktive Fenster ist. Ansonsten hole ich mir irgendwas anderes in die Zwischenablage.
Vielleicht müßte ich dann erst den Viewer als aktives Fenster machen und dann könnte es klappen. Aber dazu fehlen mit wiederum die Windowsfunktionen. Jedenfalls kenne ich diese nicht.
SetForegroundWindow könnte da helfen.
http://msdn.microsoft.com/de-de/library/bb979463.aspx

EDIT:
unter verwendung von SetActiveWindow.
Also erst Aktivieren.

Gruss Emil
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 11:24
Der Vorteil von von wm_print etc. ist ja das es nicht wirklich sichtbar sein muss etc. Es würde also theoretich auch mit Fenstern funktionieren die im Hintergrund sind.
Wenn man jetzt anfängt und meint die Drucktaste zu simulieren welche letztendlich nur das aktive Fenster als Bild in die Zwischenablage speichert ist es doch um einiges eleganter selbst den Screenshot mit GetDC, BitBlt etc. zu machen da man dadurch wenigstens die Zwischenablage in Ruhe lässt.
Aber wie bereits erwähnt ist Drucktaste etc. nicht das gleiche wie wm_print.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.334 Beiträge
 
Delphi XE5 Professional
 
#15

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 12:16
Wie man einen Screenshot von einem Window im Vordergrund macht sieht man zum Beispiel dort. Für ein inaktives Window benutzen sie allerdings auch PrintWindow, weil die davorliegenden Windows mit auf dem Bild sind.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#16

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 12:50
okay .. dann gebe ich mich geschlagen, dass Windows2000 noch so oft benutzt wird, wusste ich nicht.

Ich hätte ja mal einen etwas frechen Vorschlag, kannst Du ihn mal probieren? Würde mich auch interesieren, ob das geht.
Hol Dir doch mal eine user32.dll von einem XP System. Benenne Sie kurz um und kopiere sie Dir in Dein eigenes Projektverzeichnis.
Und probiere dann, ob Du die Funktion aus der DLL einfach so nutzen kannst, oder ob diese wiederum andere DLL'S benötigt
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 12:52
Diese Abhängigkeiten könnte man auch mit dem DependenyWalker vorher abchecken
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#18

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 12:58
ich lerne immer gern dazu, aber ich kannte bisher nichtmal den Namen "Dependency Walker"
kurz gegoogelt .. eine Frage stellt sich da, bekommmt man da nur raus, welche Abhängigkeiten für die gesamte DLL bestehen, oder auch für einzelne Funktionen in dieser DLL?
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#19

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 13:03
Ich habe dies nun mit der angegebenen Funktion versucht, ein wenig umgebaut und zur Zeit funktioniert diese Funktion.
Ein Problem ist nur, dass, wenn ich die Zeit "sleep(5)" rausnehme, kommt nur ein schwarzes Fenster ohne Inhalt. Dies könnte Probleme bei anderen Rechnern bringen, denn es wird bestimmt nicht immer die Zeit reichen. Bei langsameren Rechner wird das wohl noch mehr sein.
Die Funktion holt erst die Info, welches Fenster genutzt werden soll und dann wird der Screenshot erzeugt. Man muss nur wissen, wie das Programm unter Windows heißt.
Jetzt fällt nur auf, dass das Fenster aktiv in den Vordergrund gebracht wird. Aber für meine Zwecke sollte es mehr oder weniger immer sichtbar sein.
Danke für die Tipps und eventuelle Verbesserungsmöglichkeiten.

Ergänzung: Wenn das Fenster teilweise über den rechten Rand hinausragt, wird es nicht mehr komplett kopiert, sondern es erscheint rechts ein weißer Streifen.

Delphi-Quellcode:
  procedure ScreenShot(wnd: HWND; destBitmap : TBitmap) ;
  var
    w,h : integer;
    DC : HDC;
    hWin : Cardinal;
    r : TRect;

  begin
    SetActiveWindow(wnd);
    SetForegroundWindow(wnd);
    sleep(5);
    hWin := GetForegroundWindow;
    dc := GetWindowDC(hWin) ;
    GetWindowRect(hWin,r) ;
    w := r.Right - r.Left;
    h := r.Bottom - r.Top;
    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;


//und Aufruf

  WinName:=Class4Screenshot; //hier den Namen des Programmes übnergeben

  wnd := FindWindow(PChar(WinName), nil); //Handle vom Viewer Fenster

  if wnd=0 then begin
    ShowMessage('Fenster nicht gefunden für Screenshot "'+WinName+'"');
  end
  else begin

    b := TBitmap.Create;
    try
      ScreenShot(wnd, b) ;
      Image1.Picture.Bitmap.Assign(b) ;
    finally
      b.FreeImage;
      FreeAndNil(b) ;
    end;
Matthias
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.334 Beiträge
 
Delphi XE5 Professional
 
#20

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 17:03
Zitat von zeras:
Delphi-Quellcode:
    SetActiveWindow(wnd);
    SetForegroundWindow(wnd);
    sleep(5);
    hWin := GetForegroundWindow;
Zwei Variablen (wnd, hWin) für ein Handle?

Wenn das Fenster im Vorgergrund ist, braucht man nicht warten.
Delphi-Quellcode:
if GetForegroundWindow <> wnd
then begin
  SetForegroundWindow(wnd);
  sleep(5);
end;
Als Alternativen zum Fensterwechsel kannst Du Dir das mal ansehen: http://www.swissdelphicenter.ch/de/showcode.php?id=261
Zitat:
{
Manchmal funktioniert die SetForeGroundWindow Funktion
nicht so, wie sie sollte; besonders unter Windows 98/2000,
wenn ein anderes Fenster den Fokus hat.
ForceForegroundWindow ist eine "verbesserte" Version von
der SetForeGroundWindow API-Funktion, um ein Fenster in
den Vordergrund zu bringen.
}
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 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