Autor Beitrag
Blitzkrieg Bop
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 02.08.06 20:38 
Zunächst erstmal Grüße von meiner Seite, ich habe mich gerade angemeldet und dies wird mein erster Thread/Post in diesem Forum :).

Ok, dann mal gleich zu meiner Frage:
Ich will in der Tat einen Screenshot vom Desktop machen und diesen in ein Image-Objekt speichern.
Ihr braucht keine Angst haben, denn natürlich habe ich die Suche benutzt und weiß daher, wie das geht(BitBlt(...) usw.).
Das Problem ist nur folgendes: Ich will einen Screenshot haben, aber nur von dem Wallpaper und den auf dem Desktop befindlichen Icons!
Das wäre also ungefähr so, als ob man alle offenen Fenster minimiert, und dann den Screenshot anfertigt.
Die Frage ist also nun, wie man das am besten umsetzen könnte. Ich habe direkt in die Rubrik Win-API gepostet, da ich denke, das es höchstens über die Win-API realisierbar ist.

Eine Lösungsvariante wäre sicherlich die, das man eine Minimierung aller offenen Fenster über Win-API, über die Simulation von Tastendrücken nämlich, simuliert und dann den Screenshot erstellt. Problematisch wird das ganze nur, wenn man eine Anwendung hat, die im Vollbildmodus arbeitet :?.
Daher sollte die mögliche Lösung auch im Vollbildmodus ausführbar sein.

Nun dann, ich bin gespannt auf eure Ideen :).

MFG

Moderiert von user profile iconTino: Titel geändert.
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Mi 02.08.06 21:20 
Hallo und :welcome:

Habe über den Google-Cache das hier gefunden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var 
  WinDC, 
  MemDC   : hDC;
  Desktop : hBitmap;
  zx,
  zy      : integer;
begin 
  zx := Screen.Width;
  zy := Screen.Height;
  WinDC := GetDC (GetDeskTopWindow); {Bildschirmkontext holen} 
  MemDC := CreateCompatibleDC (WinDC); {Kompatiblen Kontext erstellen} 
  Desktop := CreateCompatibleBitmap (WinDC, zx, zy); {Bitmaphandle machen} 
  SelectObject (MemDC, Desktop); {selektieren} 
  BitBlt (MemDC, 00, zx, zy, WinDC, 00, SRCCOPY); {kopieren} 
  DeleteDC (MemDC); {und wech damit} 
  ReleaseDC (GetDeskTopWindow, WinDC); {diesen auch} 
end;


Daran solltest du dich mal orientieren können... Kommentare sind nicht von mir... Der Code war mal auf der Seite www.happyarts.de/delphi/faq/Handle_d.htm , wie gesagt, Google hat ihn noch im Cache (Suche bei Google DESKTOP HANDLE).


MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Blitzkrieg Bop Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 02.08.06 23:20 
Hallo!
Danke für die Antwort, MrSaint.
Ich habe gleich mal versucht, die Idee umzusetzen (sowas ähnliches probierte ich im Vorfeld bereits), aber das Ergebnis ist nicht gerade das Beste. Da ich noch nicht solange mit Delphi arbeite, kann es durchaus sein, das sich irgendwo ein Fehler eingeschlichen hat. Ich würde mich daher freuen, wenn mal ein Blick auf meinen Versuch gewagt wird:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm3 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
var
  WinDC,
  MemDC   : hDC;   
  Desktop : hBitmap;
  zx,
  zy      : integer;
begin
  with Image1.Canvas do
   Ellipse(0,0,Image1.Width,Image1.Height);
  zx := Screen.Width;
  zy := Screen.Height;
  WinDC := GetDC (GetDeskTopWindow); {Bildschirmkontext holen}
  MemDC := CreateCompatibleDC (WinDC); {Kompatiblen Kontext erstellen}
  Desktop := CreateCompatibleBitmap (WinDC, zx, zy); {Bitmaphandle machen}
  SelectObject (MemDC, Desktop); {selektieren}
  BitBlt (MemDC, 00, zx, zy, WinDC, 00, SRCCOPY); {kopieren}
  DeleteDC (MemDC); {und wech damit}
  ReleaseDC (GetDeskTopWindow, WinDC); {diesen auch}
  Image1.Canvas.Handle := Desktop;
end;

end.


Ein simples, kleines Programm. Wie man sieht, wird jedoch nicht der Desktophintergrund in dem Image abgebildet. Ich bin mir z.B. nicht ganz sicher, ob die Zuweisung des Image1-Handles so komplett korrekt ist, wie ich es gemacht habe:
ausblenden Delphi-Quelltext
1:
Image1.Canvas.Handle := Desktop;					


MFG
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Do 03.08.06 07:33 
Hmm... Ich hab's aus die Schnelle damit versucht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
var 
  WinDC,
  MemDC   : hDC;
  Desktop : hBitmap;
  zx,
  zy      : integer;
  bmp     : TBitmap;
begin
  zx := Screen.Width;
  zy := Screen.Height;
  WinDC := GetDC (GetDeskTopWindow); {Bildschirmkontext holen}
  MemDC := CreateCompatibleDC (WinDC); {Kompatiblen Kontext erstellen}
  Desktop := CreateCompatibleBitmap (WinDC, zx, zy); {Bitmaphandle machen}
  SelectObject (MemDC, Desktop); {selektieren}
  BitBlt (MemDC, 00, zx, zy, WinDC, 00, SRCCOPY); {kopieren}
  DeleteDC (MemDC); {und wech damit}
  ReleaseDC (GetDeskTopWindow, WinDC); {diesen auch}
  bmp := TBitmap.Create;
  try
    bmp.Handle := Desktop;
    Image1.Picture.Bitmap.Assign(bmp);
  finally
    FreeAndNil(bmp);
  end;
end;


Leider wird auch ein "normaler" Screenshot gemacht :( Vielleicht fällt mir ja irgendwann mal noch was dazu ein, muss jetzt aber rst mal weg...


MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Blitzkrieg Bop Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 03.08.06 14:17 
Nagut, danke für die Mühe erstmal :zustimm:!
Vielleicht fällt dir ja noch was ein, oder jemand anderes hat noch eine Idee :).

MFG