Autor |
Beitrag |
Blitzkrieg Bop
Hält's aus hier
Beiträge: 4
|
Verfasst: 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 Tino: Titel geändert.
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mi 02.08.06 21:20
Hallo und
Habe über den Google-Cache das hier gefunden:
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); MemDC := CreateCompatibleDC (WinDC); Desktop := CreateCompatibleBitmap (WinDC, zx, zy); SelectObject (MemDC, Desktop); BitBlt (MemDC, 0, 0, zx, zy, WinDC, 0, 0, SRCCOPY); DeleteDC (MemDC); ReleaseDC (GetDeskTopWindow, WinDC); 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 ( 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 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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:
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 public 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); MemDC := CreateCompatibleDC (WinDC); Desktop := CreateCompatibleBitmap (WinDC, zx, zy); SelectObject (MemDC, Desktop); BitBlt (MemDC, 0, 0, zx, zy, WinDC, 0, 0, SRCCOPY); DeleteDC (MemDC); ReleaseDC (GetDeskTopWindow, WinDC); 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:
Delphi-Quelltext 1:
| Image1.Canvas.Handle := Desktop; |
MFG
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Do 03.08.06 07:33
Hmm... Ich hab's aus die Schnelle damit versucht:
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); MemDC := CreateCompatibleDC (WinDC); Desktop := CreateCompatibleBitmap (WinDC, zx, zy); SelectObject (MemDC, Desktop); BitBlt (MemDC, 0, 0, zx, zy, WinDC, 0, 0, SRCCOPY); DeleteDC (MemDC); ReleaseDC (GetDeskTopWindow, WinDC); 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 
Hält's aus hier
Beiträge: 4
|
Verfasst: Do 03.08.06 14:17
Nagut, danke für die Mühe erstmal  !
Vielleicht fällt dir ja noch was ein, oder jemand anderes hat noch eine Idee  .
MFG
|
|
|