Delphi-PRAXiS

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

Dezipaitor 10. Jul 2007 18:52

Re: CreateWindowStation`?
 
versuch mal NIL bei den Namen der WinStation (und Desktop).

Sascha999999999 11. Jul 2007 17:14

Re: CreateWindowStation`?
 
nil, läst windows den Namen erstellen.

leider klappt jetzt nichmals mehr das festlegen auf den Desktop.

reng 1. Okt 2007 21:10

Re: CreateWindowStation`?
 
Hallo,

empfehle vorab mal einen Blick in die Microsoft MSDN Dokumentation.

U.a. folgender Link, und was da über CloseWindowsStation steht

Process Connection to a Window Station

http://msdn2.microsoft.com/en-us/library/ms684859.aspx

Gibt noch einen Artikel über Threads!

Folgendes würde ich bei der Screenshot Funktion empfehlen!

r := Rect(0, 0, Screen.Width, Screen.Height);
Bild.Width := Screen.Width;
Bild.Height := Screen.Height;
Bild.Canvas.CopyRect(r, c, r);

Dezipaitor 1. Okt 2007 23:30

Re: CreateWindowStation`?
 
Multimonitor funkz damit aber net?

Sascha999999999 1. Okt 2007 23:35

Re: CreateWindowStation`?
 
Hi reng,

ja, genau ich will ja nicht nur verbinden sondern auch anzeigen lassen.

also wie Dezipaitor schon sagt "Multimonitoring".

Gruß
Sascha999999999

Dezipaitor 2. Okt 2007 00:54

Re: CreateWindowStation`?
 
Ich habs nicht ausprobiert, aber damit sollte es klappen:

http://msdn2.microsoft.com/en-us/library/ms534809.aspx
http://msdn2.microsoft.com/en-us/library/ms534596.aspx
http://www.codeproject.com/system/multiplemonitor.asp
Etwas kaputter Code:
http://www.gamedev.net/community/for...opic_id=380172

Sag bescheid, wenn du was hast, ok?

Sascha999999999 2. Okt 2007 19:16

Re: CreateWindowStation`?
 
Das ist aufjedenfall schonmal besser als als des andere, aber nochnicht so ganz, die Beitäge beschreiben das Spiegeln oder verwalten mehrer Monitore an einem Computer.

Es soll aber folgendes gesehen:
Neue WindowsSession mit einer WindowsStation (CreateWindowStation) und Desktop und dann ein nichtsichtbarer Monitor der keine Hardware benötigt von dem man Screenshots machen kann.

Also Screenshots von einem Virtual Monitor.

Das ist z.B. bei "PC Anyware", oder dem Windows Remote Control Protokoll wenn man MultiSessions anmacht möglich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz