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/)
-   -   Erkennen von Remote Desktop (https://www.delphipraxis.net/155631-erkennen-von-remote-desktop.html)

Alfonso 1. Nov 2010 18:48

Erkennen von Remote Desktop
 
Hallo,
ich muss in meinem Programm (Delphi 2006) erkennen, ob es über Remote Desktop aufgerufen wird.
Hat jemand eine Idee wie man das rausbekommt?

Gruß
Alfonso

Luckie 1. Nov 2010 19:00

AW: Erkennen von Remote Desktop
 
Darf man fragen warum?

Assarbad 1. Nov 2010 19:02

AW: Erkennen von Remote Desktop
 
Zitat:

Zitat von Luckie (Beitrag 1059003)
Darf man fragen warum?

Bspw. um Double-Buffering abzuschalten, da dies über RDP sinnlos ist.

@Alfonso: MSDN-Library durchsuchenSystemParametersInfo

Oops, knapp daneben ist auch vorbei: MSDN-Library durchsuchenGetSystemMetrics mit SM_REMOTESESSION.

Luckie 1. Nov 2010 19:03

AW: Erkennen von Remote Desktop
 
Wieder was gelernt.

Assarbad 1. Nov 2010 19:10

AW: Erkennen von Remote Desktop
 
Vielleicht doch noch ein paar Worte dazu warum Double-Buffering sinnlos ist über RDP.

RDP basiert darauf, daß bei kleiner Bandweite möglichst performant der Eindruck eines flüssigen Arbeitens vermittelt werden kann. Double-Buffering ist die Methode seine Inhalte erst auf einen DC im Speicher zu zeichnen und diesen dann komplett (also quasi wie eine Bitmap) auf den Bildschirmbereich zu kopieren der aktualisiert werden soll. Während das lokal eine sinnvolle Vorgehensweise ist, steht diese bei RDP dem vorgenannten Ziel entgegen: schnell zu sein. Denn während es in der Tat lokal schneller ist einen kompletten DC zu kopieren, ist es über RDP so, daß wir eine weitaus größere Datenmenge als unbedingt notwendig übertragen müssen, was an der Geschwindigkeit kratzt.

Alfonso 1. Nov 2010 19:44

AW: Erkennen von Remote Desktop
 
In meinem Programm kann man Dateien in die Datenbank kopieren.
Ich bitte meinen Anwemdern nicht den normalen Dateiauswahldialog an, sondern habe auf basis von TFilelistbox eine eigene Dateiauswahl gemacht. Wenn ich mein Programm über Remotedesktop aufrufe, soll das Quell-Laufwerk natürlich nicht C:, D: oder ähnliches sein, da dieses ja auf dem Remoterechner liegt. Ich muss in diesem Fall erkennen, welche Laufwerke er Remote als lokale Ressource eingebunden hat, in dem ich folgendes mache:
Delphi-Quellcode:
for i := 67 to 90 do
  begin
   if DirectoryExists('\\tsclient\'+chr(i)+'\') then
    cbbDrive.Items.Add('Remote '+chr(i));
  end;
Dann werden diese "Netzlaufwerke" als Quelllaufwerke angezeigt.

Oder gibt es etwas einfacheres?

Gruß
Alfonso

Assarbad 1. Nov 2010 20:05

AW: Erkennen von Remote Desktop
 
Zitat:

Zitat von Alfonso (Beitrag 1059014)
Oder gibt es etwas einfacheres?

Da müßtest du mal Remko fragen (der ist auch Benutzer hier, aber dann ggf. auf Englisch fragen ;)).

Es könnte durchaus eine der WTS*-Funktionen besser geeignet sein, aber ich müßte mich erst einlesen und er weiß es vielleicht ohne Nachgucken.

himitsu 1. Nov 2010 20:50

AW: Erkennen von Remote Desktop
 
Selbst wenn es anders besser geht,
aber so sieht es bestimmt etwas übersichtlicher aus.
Delphi-Quellcode:
var c: Char;

for c := 'C' to 'Z' do
  if DirectoryExists('\\tsclient\' + c) then
    cbbDrive.Items.Add('Remote ' + c);
Du könntest doch immer nach Remote-Laufwerken suchen und alle lokalen ( X: ) und Remote-Laufwerke ( \\tsclient\X ) anbieten, egal wo das Programm läuft.

Eventuell möchte auch mal jemand via Remote ein lokales Laufwerk nutzen und umgekehrt.

Remko 1. Nov 2010 22:54

AW: Erkennen von Remote Desktop
 
Zitat:

Zitat von Assarbad (Beitrag 1059018)
Zitat:

Zitat von Alfonso (Beitrag 1059014)
Oder gibt es etwas einfacheres?

Da müßtest du mal Remko fragen (der ist auch Benutzer hier, aber dann ggf. auf Englisch fragen ;)).

Es könnte durchaus eine der WTS*-Funktionen besser geeignet sein, aber ich müßte mich erst einlesen und er weiß es vielleicht ohne Nachgucken.

Sadly there is not Wts* or even WinStation* function that can do this, but I tested the code below and that's the only way I see to enumerate all Client Drives:

Delphi-Quellcode:
uses
  JwaWinType, JwaWinNetWk; // Jedi Apilib, can also use JwaWindows instead of Single Units

const
  WNNC_NET_TERMSRV    = $00360000;

type
  TNetResourceArray = array[0..ANYSIZE_ARRAY-1] of NETRESOURCE;
  PNetResourceArray = ^TNetResourceArray;

procedure TForm3.Button1Click(Sender: TObject);
var
  NetResPtr: PNetResourceArray;
  ProviderName: array[0..MAX_PATH] of Char;
  BufSize: DWORD;
  hEnum: DWORD;
  Count: DWORD;
  Res: Cardinal;
  i: Integer;
begin
  // Get Provider Name (should be 'Microsoft Terminal Services')
  BufSize := Length(ProviderName) * SizeOf(Char);
  ZeroMemory(@ProviderName[0], BufSize);
  Res := WNetGetProviderName(WNNC_NET_TERMSRV, ProviderName, BufSize);
  if Res <> NO_ERROR then
  begin
    // Handle the Error (call WNetGetLastError for more info), raise exception..
  end;

  Memo1.Lines.Add(Format('ProviderName=%s', [ProviderName]));
  Res := WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_ANY, 0, nil, hEnum);
  if Res = NO_ERROR then
  begin

    // return as many entries as possible
    Count := DWORD(-1);

    // Allocate a some memory, 16 KB is typical size per docs
    BufSize := 16384;
    Memo1.Lines.Add(Format('Allocate %d Bytes', [BufSize]));
    GetMem(NetResPtr, BufSize);
    Res := WNetEnumResource(hEnum, Count, NetResPtr, BufSize);

    while Res = ERROR_MORE_DATA do
    begin
      Inc(BufSize, SizeOf(NETRESOURCE));
      Memo1.Lines.Add(Format('Allocate %d Bytes', [BufSize]));
      ReAllocMem(NetResPtr, BufSize); // Alloc more...
      Count := DWORD(-1);
      Res := WNetEnumResource(hEnum, Count, NetResPtr, BufSize);
    end;

    if Res = NO_ERROR then
    begin
      Memo1.Lines.Add(Format('Count=%d', [Count]));
      for i := 0 to Count - 1 do
      begin
        if lstrcmpi(NetResPtr^[i].lpProvider, @ProviderName[0]) = 0 then
        begin
          Memo1.Lines.Add(Format('Found TSClient Drive: %s', [NetResPtr^[i].lpRemoteName]));
        end
        else begin
          Memo1.Lines.Add(Format('Found non TSClient Drive: %s', [NetResPtr^[i].lpRemoteName]));
        end;
      end;
    end
    else begin
      Memo1.Lines.Add(Format('WNetEnumResource returned %d', [Res]));
    end;

    FreeMem(NetResPtr);
    WNetCloseEnum(hEnum);
  end
  else begin
    Memo1.Lines.Add(Format('WNetOpenEnum returned %d', [Res]));
  end;
end;

end.
On my testsystem the output is:
ProviderName=Microsoft Terminal Services
Allocate 16384 Bytes
Count=3
Found TSClient Drive: \\tsclient\Z
Found TSClient Drive: \\tsclient\C
Found TSClient Drive: \\tsclient\D

Dezipaitor 2. Nov 2010 16:09

AW: Erkennen von Remote Desktop
 
Raymond Chen hat auch was geschrieben, wann man auf RDP prüfen sollten und warum:
http://blogs.msdn.com/b/oldnewthing/...03/508694.aspx


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 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