2013-07-11 11 views
10

Wie erhalten Sie den aktuell angemeldeten Benutzernamen in einem Firemonkey Delphi Projekt? Ich ziele sowohl auf Windows als auch auf Mac.Wie bekomme ich den aktuell angemeldeten Benutzernamen?

Ich habe XE2, aber ich nehme an, jede Version Lösung ist in Ordnung, weil ich bei Bedarf aktualisieren werde.

+0

Sieht nicht wie FMX.Platform bietet diese Informationen –

Antwort

17

Für Windows können Sie die WinAPi-Funktion GetUserName verwenden, für OSX können Sie die Methoden NSUserName und/oder NSFullUserName verwenden.

Versuchen Sie, diese Probe für OSX

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    Macapi.CoreFoundation, 
    Macapi.Foundation, 
    System.SysUtils; 

function NSUserName: Pointer; cdecl; external '/System/Library/Frameworks/Foundation.framework/Foundation' name _PU +'NSUserName'; 
function NSFullUserName: Pointer; cdecl; external '/System/Library/Frameworks/Foundation.framework/Foundation' name _PU + 'NSFullUserName'; 

begin 
    try 
    Writeln(Format('User Name  %s',[TNSString.Wrap(NSUserName).UTF8String])); 
    Writeln(Format('Full User Name %s',[TNSString.Wrap(NSFullUserName).UTF8String])) 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

Für Windows

{$APPTYPE CONSOLE} 


uses 
    Windows, 
    SysUtils; 

function WUserName: String; 
var 
    nSize: DWord; 
begin 
nSize := 1024; 
SetLength(Result, nSize); 
if GetUserName(PChar(Result), nSize) then 
    SetLength(Result, nSize-1) 
else 
    RaiseLastOSError; 
end; 


begin 
    try 
    Writeln(WUserName); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    readln; 
end. 

in einer einzigen Einheit zusammengestellt:

uses 
    {$IFDEF MACOS} 
    MacApi.CoreFoundation, MacApi.Foundation, 
    {$ENDIF} 
    {$IFDEF MSWINDOWS} 
    Windows, 
    {$ENDIF} 
    System.SysUtils; 

{$IFDEF MACOS} 
function NSUserName: Pointer; cdecl; external '/System/Library/Frameworks/Foundation.framework/Foundation' name '_NSUserName'; 
{$ENDIF} 

function GetUserName: String; 
{$IFDEF MSWINDOWS} 
var 
    nSize: DWord; 
{$ENDIF} 
begin 
    {$IFDEF MACOS} 
    Result := TNSString.Wrap(NSUserName).UTF8String; 
    {$ENDIF} 
    {$IFDEF MSWINDOWS} 
    nSize := 1024; 
    SetLength(Result, nSize); 
    if Windows.GetUserName(PChar(Result), nSize) then 
    begin 
    SetLength(Result, nSize - 1) 
    end 
    else 
    begin 
    RaiseLastOSError; 
    end 
    {$ENDIF} 
end; 
+0

Danke. Ich versuche das jetzt. Was ist '_PU'? –

+0

_PU ist nur eine Konstante für '_' – RRUZ

+0

Vielen Dank! Ich wusste nicht, dass man "fehlende" OS X-Funktionen hinzufügen könnte. –

2

Eine andere einfachere Lösung ist es, den Computernamen über die Umwelt zu erhalten Variable mit GetEnvironmentVariable Funktion wie folgt:

Result := GetEnvironmentVariable('USERNAME'); 

P.S.Diese Lösung ist für Windows und Linux, aber Sie müssen Ihren Delphi-Quellcode überprüfen, wenn er unterstützt wird.

+0

Fantastisch einfach (DXE3 & Win10), danke. GetEnvironmentVariable gibt so viele Informationen. +1. – Johnny

Verwandte Themen