2013-07-11 126 views
10

如何在Firemonkey Delphi項目中獲取當前登錄的用戶名?我的目標是Windows和Mac。如何獲取當前登錄的用戶名?

我有XE2,但我想任何版本的解決方案都很好,因爲我會根據需要進行升級。

+0

看起來不像FMX.Platform提供的信息 –

回答

17

對於Windows,您可以使用GetUserName WinAPi函數,對於OSX,您可以使用NSUserName和/或NSFullUserName方法。

試試這個樣品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. 

對於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. 

編譯成一個單元:

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

謝謝。我正在嘗試這個。什麼是'_PU'? –

+0

_PU只是'_'的一個常量 – RRUZ

+0

謝謝!我不知道你可以添加這樣的「缺失」OS X功能。 –

2

另一種簡單的解決方法是通過環境來獲取計算機名稱變量使用GetEnvironmentVariable功能如下:

Result := GetEnvironmentVariable('USERNAME'); 

P.S.This解決方案是用於Windows和Linux,但你需要的,如果是支持它來檢查你的Delphi源代碼。

+0

非常簡單(DXE3和Win10),謝謝。 GetEnvironmentVariable提供瞭如此多的信息。 +1。 – Johnny

相關問題