AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi ScreenShot von nichtsehbaren Desktop
Thema durchsuchen
Ansicht
Themen-Optionen

ScreenShot von nichtsehbaren Desktop

Offene Frage von "Neotracer"
Ein Thema von SleepyMaster · begonnen am 21. Okt 2004 · letzter Beitrag vom 1. Jan 2012
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
Sascha999999999

Registriert seit: 28. Sep 2006
45 Beiträge
 
#31

Re: ScreenShot von nichtsehbaren Desktop

  Alt 11. Jan 2007, 15:20
[quote="Olli"]
Zitat von Sascha999999999:
geht es auch Ohne?
Ja, wahrscheinlich sogar besser, aber nicht für alle Desktops.

was heißt "aber nicht für alle Desktops"?
  Mit Zitat antworten Zitat
Sascha999999999

Registriert seit: 28. Sep 2006
45 Beiträge
 
#32

Re: ScreenShot von nichtsehbaren Desktop

  Alt 11. Jan 2007, 15:29
sorry, aber bei mir sind die Weiß!
Angehängte Dateien
Dateityp: rar exscreen_214.rar (512,4 KB, 22x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#33

Re: ScreenShot von nichtsehbaren Desktop

  Alt 8. Nov 2009, 21:12
Jupp, selbes Problem.
Bei mir ist auch alles nur Weiß.

Vom normalen/sichtbaren Desktop "default" klappt es, aber nicht bei einem nicht Sichtbaren

Delphi-Quellcode:
Procedure THandler.ScreenShot(Desktop: String; Stream: TStream; Quality: Byte = 100);
  Var Desk: HDESK;
    OldDesk: HDESK;
    Canvas: TCanvas;
    Bitmap: TBitmap;
    Jpeg: TJPEGImage;
    R: TRect;

  Begin
    Desk := OpenDesktop(PChar(Desktop), 0, False, DESKTOP_CREATEMENU
      or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL
      or DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP
      or GENERIC_WRITE);
    OldDesk := GetThreadDesktop(GetCurrentThreadId);
    SetThreadDesktop(Desk);
    Try
      Jpeg := TJPEGImage.Create;
      Try
        Bitmap := TBitmap.Create;
        Try
          Canvas := TCanvas.Create;
          Try
            Canvas.Handle := GetWindowDC(GetDesktopWindow);
            R := Rect(0, 0, Screen.Width, Screen.Height);
            Bitmap.Width := Screen.Width;
            Bitmap.Height := Screen.Height;
            Bitmap.Canvas.CopyRect(R, Canvas, R);
          Finally
            ReleaseDC(0, Canvas.Handle);
            Canvas.Free;
          End;
          //Image.Width := Bitmap.Width;
          //Image.Height := Bitmap.Height;
          Jpeg.CompressionQuality := Quality;
          Jpeg.Assign(Bitmap);
        Finally
          Bitmap.Free;
        End;
        Jpeg.SaveToStream(Stream);
      Finally
        Jpeg.Free;
      End;
    Finally
      SetThreadDesktop(OldDesk);
      CloseDesktop(Desk);
    End;
  End;
[add]
Ach ja, ich versuche nicht irgendeinen Desktop zu lesen.
Mein Programm hat Einen mit CreateDesktop erstellt und genau diesen möchte ich nun auch gern "sehen" können

Delphi-Quellcode:
Desktop := CreateDesktop(PChar('Run' + IntToStr(GetCurrentProcessId)),
  nil, nil, 0, DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE
  or DESKTOP_HOOKCONTROL or DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS
  or DESKTOP_SWITCHDESKTOP or GENERIC_WRITE, nil);
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#34

Re: ScreenShot von nichtsehbaren Desktop

  Alt 9. Nov 2009, 11:16
http://fnse.de/S02/15S.gif


MSDN
The SetThreadDesktop function will fail if the calling thread has any windows or hooks on its current desktop

So, auch wenn es bei mir nicht in einem extra Thread läuft.
Es handelt sich um eine Konsolenanwendung,
SetThreadDesktop liefert auch immer braf True,
aber es bleibt alles weiß.

Mache ich den Desktop allerdings sichtbar, dann geht es plötzlich.

Also liegt es wohl wirklich nur an dem "unsichtbar".
$2B or not $2B
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#35

Re: ScreenShot von nichtsehbaren Desktop

  Alt 9. Nov 2009, 23:12
Scheint mir ganz sinnig zu sein.
Nur der Desktop, der gerade Eingaben empfängt, generiert auch Zeichennachrichten. Alles andere wäre ja Verschwendung von Resourcen, oder nicht?

Ich habe es nicht probiert, aber vielleicht kann man eine neue WindowStation mit einem Desktop aufmachen. Da nur Winsta0 mit dem Keybboard und Monitor verbunden ist, könnte es gut sein, dass andere Windowstations eigene Zeichenbereiche, unabhängig vom echten Desktop, besitzen.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#36

Re: ScreenShot von nichtsehbaren Desktop

  Alt 9. Nov 2009, 23:29
Ja, aber gerade deswegen wollte ich ja einen ScreenShot machen, weil man ihn (sonst) nicht sieht.

Hab auch schon versucht mit FindWindowEx die Fenster durchzugehn und einzeln zu zeichnen.
Ging auch nicht, aber kann auch sein, daß ich was falsch gemacht hab.

Auch MSDN-Library durchsuchenPrintWindow half nix, wobei dieses noch 'ne Unschöne Nebenwirkung hatte,
denn wenn der Desktop sichtbar war, verschanden die zu "druckenden" Fenster für ein/zwei Sekunden vom Bildschirm
http://www.delphipraxis.net/internal...t.php?t=139750

Zitat:
Nur der Desktop, der gerade Eingaben empfängt, generiert auch Zeichennachrichten.
Selbst wenn ich diese Nachrichten generiere, geht es anscheinend nicht.


Im Grunde sollte es eine Hintergrund-Remote-Desktop-Software für Arme werden, aber wenn man den Deskop nicht sieht, läßt es sich etwas schwer damit arbeiten.
$2B or not $2B
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#37

Re: ScreenShot von nichtsehbaren Desktop

  Alt 9. Nov 2009, 23:41
Ich habe eine mögliche Lösung gegeben. Ich verstehe nicht, warum man trotzdem versucht etwas zum Laufen zu bringen, was so nicht entworfen wurde. Das ganze ist absichtlich so gebaut worden.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#38

Re: ScreenShot von nichtsehbaren Desktop

  Alt 10. Nov 2009, 00:07
Bin ja schon dabei es über eine eigene WindowStation zu probieren, aber wenn dieses funktioniert und dann auch noch richtig zum Einsatz kommen soll, werde ich das halbe Projekt auch noch auf 'nen Service umstellen müssen, wegen der nötigen Rechte.

Na dann mal sehn wie ich meinen ersten Service dann so hinbekomm.

Wobei ich eine Idee noch hätte.
- eine invisible Form auf dem sichtbaren Desktop, in welche dann alle Fenter kurz als Childs (MDI) eingebunden werden

aber ich glaub das heb ich mir für den Notfall auf.
$2B or not $2B
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#39

Re: ScreenShot von nichtsehbaren Desktop

  Alt 10. Nov 2009, 00:10
Du kannst den Service in einer eigenen Winstation laufen lassen. Das interessiert den nicht
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#40

Re: ScreenShot von nichtsehbaren Desktop

  Alt 10. Nov 2009, 09:26
nja, wie gesagt, ich bau es jetzt erstmal so um, daß statt 'nes Desktops gleich eine ganze WindowsStation erstellt wird und nutze dann dessen Standarddesktop ... brauch aber noch ein paar Minütchen.
Und dann muß ich mal sehn, wie ich das Programm in einen Service umwandel, weil ohne Adminrechte geht es dann nimmer.

Zitat von Union:
Delphi-Quellcode:
GetUserObjectInformation(OpenInputDesktop(0, false, GENERIC_ALL), UOI_NAME, @pDesktopname, 256, dwLen);
SetString(DesktopName, pDesktopName, dwLen-1);
hDesktop := OpenDesktop(PAnsiChar(Desktopname), 0, false, GENERIC_ALL);
if hDesktop <> 0 then
OK, abgesehn davon, daß der mit OpenInputDesktop geöffnete Desktop laut MSDN auch wieder geschlossen werden muß was er hier nicht wird...

Aber versteh ich den Code richtig?
Man öffnet den Desktop der WindowStation, besorgt sich den Namen und öffnet ihn dann nochmal?

Also theoretisch würde es doch dann reichen den zuerstgefundenen Desktop gleich zu benutzen?
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 19:12 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