2013-07-11 87 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

相关问题