2013-07-11 14 views
10

Jak uzyskać aktualnie zalogowaną nazwę użytkownika w projekcie Firemonkey Delphi? Jestem kierowany zarówno na system Windows, jak i na Maca.Jak uzyskać aktualnie zalogowany login?

Mam XE2, ale przypuszczam, że dowolne rozwiązanie wersji jest w porządku, ponieważ w razie potrzeby zaktualizuję.

+0

Nie wygląda na to, że FMX.Platform oferuje te informacje. –

Odpowiedz

17

Dla Windows możesz użyć funkcji WinAPi GetUserName, dla OSX możesz użyć metod NSUserName i/lub NSFullUserName.

Spróbuj próbki dla 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. 

Dla 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. 

zebrane w jednym urządzeniu:

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

Dzięki. Próbuję tego teraz. Co to jest "_PU"? –

+0

_PU jest po prostu stałą dla '_' – RRUZ

+0

Dziękuję! Nie wiedziałem, że możesz dodać "brakujące" funkcje OS X w ten sposób. –

2

Innym prostszym rozwiązaniem jest aby uzyskać nazwę komputera poprzez środowisko zmienna przy użyciu funkcji GetEnvironmentVariable w następujący sposób:

Result := GetEnvironmentVariable('USERNAME'); 

P.S.To rozwiązanie jest przeznaczone dla systemów Windows i Linux, ale należy sprawdzić kod źródłowy Delphi, jeśli jest on obsługiwany.

+0

Fantastycznie proste (DXE3 i Win10), dzięki. GetEnvironmentVariable daje tak wiele informacji. +1. – Johnny

Powiązane problemy