Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CreateWindowStation`? (https://www.delphipraxis.net/95481-createwindowstation%60.html)

Sascha999999999 7. Jul 2007 10:59


CreateWindowStation`?
 
Hallo, ich möchte für einen Servies einen interactiven Desktop erstellen und diesen auch "Abfotografieren" können.

Erstelle ich einen Desktop, so wird dieser beim Screenshot leider immer weiß.

Andere Dienste wie pcAnywhere oder der Microsoft Terminal Services können das ja auch iregndwie.

Also erstes muss man wohl eine Window Station erstellen, und dann den Desktop.

Delphi-Quellcode:
procedure DoScreenShot();
var
  c: TCanvas;
  r: TRect;
  Bild: TBitMap;
begin
  c := TCanvas.Create;
  Bild:=TBitMap.Create;
  c.Handle := GetWindowDC(GetDesktopWindow);
  try
    r := Rect(0, 0, 800, 600);
    Bild.Width := 800;
    Bild.Height := 600;
    Bild.Canvas.CopyRect(r, c, r);
  finally
    ReleaseDC(0, c.Handle);
    Bild.SaveToFile('C:\screencapture.bmp');
    c.Free;
  end;
end;

procedure TVDesk.Execute;
var
   hDesktop : HDESK;
   hWinstation : HWINSTA;
begin
   hWinstation := CreateWindowStation('TVStation', 0, STANDARD_RIGHTS_REQUIRED or WINSTA_ACCESSCLIPBOARD or WINSTA_ACCESSGLOBALATOMS or WINSTA_CREATEDESKTOP or WINSTA_ENUMDESKTOPS or WINSTA_ENUMERATE or WINSTA_EXITWINDOWS or WINSTA_READATTRIBUTES or WINSTA_READSCREEN or WINSTA_WRITEATTRIBUTES, nil);
   if hWinstation <> 0 then
   begin
      if SetProcessWindowStation(hWinstation) then
      begin
         hDesktop := CreateDesktop(PAnsiChar('TVDesktop'), nil, nil, 0, DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or DESKTOP_JOURNALPLAYBACK or DESKTOP_JOURNALRECORD or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or DESKTOP_WRITEOBJECTS or STANDARD_RIGHTS_REQUIRED, nil);
         if hDesktop <> 0 then
         begin
            if SetThreadDesktop(hDesktop) then
            begin
               DoScreenShot();
            end;
            CloseDesktop(hDesktop);
         end;
      end;
      CloseWindowStation(hWinstation);
   end;
end;
Danke für jede hilfe. Oder weiß jemand wie der "Microsoft Terminal Services" das schafft?
Sascha999999999

SirThornberry 7. Jul 2007 12:15

Re: CreateWindowStation`?
 
funktioniert denn dein SetThreadDesktop? Wenn auf dem neuen Desktop kein Prozess geöffnet wird so wird der Desktop durch CloseDesktop wieder geschlossen.
Und prüfst du irgendwo ob GetDesktopWindow dir ein gültiges Handle zurück gibt? Du solltest eine Fehlerbehandlung einbauen damit du an den verschiedensten stellen auch mitbekommst wenn ein Befehl fehlschläft. ansonsten ist es ein wildes Raten wo der Fehler steckt.

Dezipaitor 7. Jul 2007 16:23

Re: CreateWindowStation`?
 
Vielleicht ist die Desktophintergrundfarbe weiß ?

Solange kein Fenster dort geöffnet ist, kann man das schlecht sagen.

Sascha999999999 8. Jul 2007 14:59

Re: CreateWindowStation`?
 
ok, da habt ihr recht ich habe den quelltext nocheinmal überarbeitet:

leider ist die Hintergrundfabe blau und alle funktionen geben true zurück...?

Ich habe jetzt noch einen Explorer auf den Desktop erstellt, kein erfolg!

Hat jemand von euch das Testprogramm mal Kompiliert?

Sascha999999999 8. Jul 2007 15:41

Re: CreateWindowStation`?
 
Dann kommt jetzt "Das Handle ist ungültig" b.z.w. "Falscher Parameter" in LastError.

Warsceinlich das Fenster Handle, was mache ich falsch?

Sascha999999999 8. Jul 2007 17:03

Re: CreateWindowStation`?
 
I found out that the Winstation must be interactive!

Is that posible?

Hat someone sourcecode for multisession? Perhaps only one interactive Winstation is possible. Interactive is needed for SwitchDesktop?

Luckie 8. Jul 2007 21:07

Re: CreateWindowStation`?
 
Könnten wir uns bitte auf eine Sprache einigen? Ich sehe hier keinen Grund andauernd zwischen Englisch und Deutsch zu wecheseoln.

Es knan nur eine interaktive WindowsSation geben. Oder woher soll Windows wissen für welche WindowsStation die Eingaben von Tastatur und Maus gedacht sind?

Dezipaitor 9. Jul 2007 14:39

Re: CreateWindowStation`?
 
Das ist eine lustige Raterunde.

Es sticht STANDARD_RIGHTS_REQUIRED so hervor,
ersetze doch mal alle WinStationRechte durch WINSTA_ALL_ACCESS.

Sascha999999999 10. Jul 2007 15:02

Re: CreateWindowStation`?
 
Deutsch ist gut,

ja, nur eine interaktive WinStation! aber z.B. PCAnyware oder der Terminalserver können doch auch mehre "Eingabedesktops" erstellen, nur das jeder weitere außer "Winstation\Default" mit den Eingaben von einem Netzwerkbenutzer verknüft werden.

Ich habe WINSTA_ALL_ACCESS versucht, leider ohne erfolg, ich habe extra die aufzählung zu WINSTA_ALL_ACCESS verwendet weil im Winlibary zwei definizonen hierzu geschrieben waren eine für interaktive und eine für non interaktive WinStartions.

Versteht ihr was ich will?

Sascha999999999 10. Jul 2007 16:01

Re: CreateWindowStation`?
 
Stichwort: Concurrent Sessions


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:33 Uhr.
Seite 1 von 2  1 2      

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