![]() |
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 |
AW: Erkennen von Remote Desktop
Darf man fragen warum?
|
AW: Erkennen von Remote Desktop
Zitat:
@Alfonso: ![]() Oops, knapp daneben ist auch vorbei: ![]() |
AW: Erkennen von Remote Desktop
Wieder was gelernt.
|
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. |
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:
Dann werden diese "Netzlaufwerke" als Quelllaufwerke angezeigt.
for i := 67 to 90 do
begin if DirectoryExists('\\tsclient\'+chr(i)+'\') then cbbDrive.Items.Add('Remote '+chr(i)); end; Oder gibt es etwas einfacheres? Gruß Alfonso |
AW: Erkennen von Remote Desktop
Zitat:
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. |
AW: Erkennen von Remote Desktop
Selbst wenn es anders besser geht,
aber so sieht es bestimmt etwas übersichtlicher aus.
Delphi-Quellcode:
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.
var c: Char;
for c := 'C' to 'Z' do if DirectoryExists('\\tsclient\' + c) then cbbDrive.Items.Add('Remote ' + c); Eventuell möchte auch mal jemand via Remote ein lokales Laufwerk nutzen und umgekehrt. |
AW: Erkennen von Remote Desktop
Zitat:
Delphi-Quellcode:
On my testsystem the output is:
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. ProviderName=Microsoft Terminal Services Allocate 16384 Bytes Count=3 Found TSClient Drive: \\tsclient\Z Found TSClient Drive: \\tsclient\C Found TSClient Drive: \\tsclient\D |
AW: Erkennen von Remote Desktop
Raymond Chen hat auch was geschrieben, wann man auf RDP prüfen sollten und warum:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 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