Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ScreenShot von nichtsehbaren Desktop (https://www.delphipraxis.net/32281-screenshot-von-nichtsehbaren-desktop.html)

Harry M. 6. Jan 2007 14:44

Re: ScreenShot von nichtsehbaren Desktop
 
Zitat:

Zitat von Sascha999999999
weiß noch jemand den unterschied zwischen:

MAXIMUM_ALLOWED, GENERIC_ALL und DESKTOP_ALL?

Klar die MSDN:
http://msdn2.microsoft.com/en-gb/library/ms682575.aspx

Sascha999999999 6. Jan 2007 15:27

Re: ScreenShot von nichtsehbaren Desktop
 
ok, habe das jetzt 6 Stunden getestet ohne Erfolg, immernoch ein weißes Screenhot:

Desktop_ALL:
Delphi-Quellcode:
const
DESKTOP_ALL = DESKTOP_READOBJECTS or DESKTOP_CREATEWINDOW or
                DESKTOP_CREATEMENU or DESKTOP_HOOKCONTROL or
                DESKTOP_JOURNALRECORD or DESKTOP_JOURNALPLAYBACK or
                DESKTOP_ENUMERATE or DESKTOP_WRITEOBJECTS or DESKTOP_SWITCHDESKTOP;
Auftruf von der Thread Function:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  ThreadID: DWORD;
  ThreadHandle: THandle;
begin
ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@ScreenFunction), nil, 0, ThreadID);
if ThreadHandle<>0 then CloseHandle(ThreadHandle);
end;
Und die Funktion:
Delphi-Quellcode:
function ScreenFunction(p:Pointer):Word;
var hDesktop : HDESK;
begin
result:=1;
if(form1.CheckBox1.checked=true) then begin
HDesktop := OpenDesktop ('myDesktop', 0, False, DESKTOP_ALL or GENERIC_ALL);
end
else begin
HDesktop := OpenDesktop ('default', 0, False, DESKTOP_ALL or GENERIC_ALL);
end;
if (HDesktop <> 0) then
begin
   if SetThreadDesktop (HDesktop) then
   begin
      ScreenCapture(form1.Image1.Picture.Bitmap);
      CloseDesktop (HDesktop);
   end;
end;
end;
last but not least, die ScreenHot Function:
Delphi-Quellcode:
procedure ScreenCapture(Bmp: TBitmap);
var
  DeskWnd: HWnd;
  DeskDC: HDC;
  DeskCv: TCanvas;
  R: TRect;
  W, H: Integer;
begin
  if Bmp = nil then Exit;
  DeskWnd := GetDesktopWindow;
  DeskDC := GetWindowDC(DeskWnd);
  DeskCv := TCanvas.Create;
  DeskCv.Handle := DeskDC;
  W := Screen.Width;
  H := Screen.Height;
  R := Bounds(0, 0, W, H);
  try
    Bmp.HandleType := bmDIB;
    Bmp.PixelFormat := pf24Bit;
    Bmp.Width := W;
    Bmp.Height := H;
    Bmp.Canvas.CopyMode := cmSrcCopy;
    Bmp.Canvas.CopyRect(R, DeskCv, R);
  finally
    DeskCv.Free;
    ReleaseDC(DeskWnd, DeskDC);
  end;
end;
Den Desktop erstelle ich vorher. Mit dem ThreadObjekt wie Ihr gesagt hattet, ist SetThreadDesktop leider immer False.

Harry M. 7. Jan 2007 02:07

Re: ScreenShot von nichtsehbaren Desktop
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das tut was soll.
Dank Union! Er hat mich via PN auf einen Umstand aufmerksamgemacht den ich so nicht erkannt habe.

Olli 7. Jan 2007 07:00

Re: ScreenShot von nichtsehbaren Desktop
 
Ist das jetzt bloß unheimlich optimiert, oder verstehe ich hier irgendwas nicht??? :gruebel:

Code:
[color=gray][...][/color]
   pDesktopName : array[0..255] of char;
[color=gray][...][/color]
         GetUserObjectInformation(OpenInputDesktop(0, false, GENERIC_ALL), UOI_NAME, @pDesktopname, 256, dwLen);
         [color=red]SetString(DesktopName, pDesktopName, dwLen-1);[/color]

         hDesktop := OpenDesktop([color=red]PAnsiChar(Desktopname)[/color], 0, false, GENERIC_ALL);
[color=gray][...][/color]
Bei dieser Form der Optimierung kann auch der Compiler nicht mehr mithalten, denke ich ... :mrgreen:

@Union: kann es denn nicht auch mehr als nur eine WinSta0 auf TS-Systemen geben?
Apropos: wie steht's denn mit der Vista- und TS-Kompatibilität??? Schon jemand getestet?

@Sascha999999999: Du postest hier wild weiter. Hast du schonmal angeschaut was die Beispiele (e.g. Union) so machen? Ich vermisse da mindestens ein wichtiges Element in deinem Code (Stichwort: WinSta). Im übrigen gibt es gute Gründe nicht immer alle Rechte anzufordern. Beispielsweise könnte dein Code schon wieder nicht funktionieren, wenn er unter einem weniger privilegierten Konto ausgeführt wird.

Union 7. Jan 2007 14:33

Re: ScreenShot von nichtsehbaren Desktop
 
Zitat:

Zitat von Olli
@Union: kann es denn nicht auch mehr als nur eine WinSta0 auf TS-Systemen geben?

Das schon, aber pro Session nur eine.

Olli 7. Jan 2007 16:31

Re: ScreenShot von nichtsehbaren Desktop
 
Zitat:

Zitat von Union
Zitat:

Zitat von Olli
@Union: kann es denn nicht auch mehr als nur eine WinSta0 auf TS-Systemen geben?

Das schon, aber pro Session nur eine.

Also war deine Funktion nicht vorgesehen um aus einem Service zu laufen?!

Union 7. Jan 2007 16:33

Re: ScreenShot von nichtsehbaren Desktop
 
Zitat:

Also war deine Funktion nicht vorgesehen um aus einem Service zu laufen?!
Das schon, aber nicht unbedingt um Screenshots von "fremden" Sessions zu machen.

Olli 7. Jan 2007 16:44

Re: ScreenShot von nichtsehbaren Desktop
 
Zitat:

Zitat von Union
Zitat:

Also war deine Funktion nicht vorgesehen um aus einem Service zu laufen?!
Das schon, aber nicht unbedingt um Screenshots von "fremden" Sessions zu machen.

Bei TS wäre doch jegliche (RDP-)Session eine fremde, außer jene die auf der Konsole läuft, was dann aber spätestens mit Vista auch der Vergangenheit angehört.

Nachtrag: Nee, Kommando zurück, über die Native API könnte es doch gehen ...

Sascha999999999 10. Jan 2007 15:07

Re: ScreenShot von nichtsehbaren Desktop
 
nein, sorry das ich es erst jetzt erwähne aber es sollte eigendlich kein Servies sein!

geht es auch Ohne?

und muss der Winstation Kram sein?

Olli 10. Jan 2007 15:28

Re: ScreenShot von nichtsehbaren Desktop
 
Zitat:

Zitat von Sascha999999999
geht es auch Ohne?

Ja, wahrscheinlich sogar besser, aber nicht für alle Desktops.

Zitat:

Zitat von Sascha999999999
und muss der Winstation Kram sein?

Ja.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr.
Seite 3 von 5     123 45      

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