2013-07-11 25 views
10

Firemonkey Delphi projesinde oturum açmış olduğunuz kullanıcı adını nasıl edinirsiniz? Hem Windows hem de Mac'i hedefliyorum.Şu anda oturum açmış kullanıcı adı nasıl?

XE2'im var, ancak herhangi bir sürüm çözümünün iyi olduğunu varsayalım, çünkü gerekirse gerekirse yükselteceğim.

+0

FMX.Platform'un bu gibi bilgi sunmuyor –

cevap

17

Windows için GetUserName WinAPi işlevini kullanabilirsiniz, OSX için NSUserName ve/veya NSFullUserName yöntemlerini kullanabilirsiniz.

Windows'un

için 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. 

için bu örnek deneyin

{$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. 

tek bir birim haline Derleyen:

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

Teşekkür ederiz. Bunu şimdi deniyorum. _PU nedir? –

+0

_PU, '_' – RRUZ

+0

için bir sabittir Teşekkür ederiz! "Eksik" OS X işlevlerini ekleyebileceğinizi bilmiyordum. –

2

Başka basit bir çözüm ortamının aracılığıyla bilgisayar adını elde etmektir GetEnvironmentVariable kullanarak değişken aşağıdaki gibi çalışır:

Result := GetEnvironmentVariable('USERNAME'); 

Not: Bu çözüm Windows ve Linux içindir, ancak destekleniyorsa Delphi kaynak kodunuzu kontrol etmeniz gerekir.

+0

Fevkalade basit (DXE3 & Win10), teşekkürler. GetEnvironmentVariable çok bilgi verir. +1. – Johnny

İlgili konular