2013-07-11 7 views
10

Как вы получаете текущее имя пользователя в проекте Firemonkey Delphi? Я нацелен как на Windows, так и на Mac.Как получить в настоящее время вошедшее имя пользователя?

У меня XE2, но я предполагаю, что решение любой версии в порядке, потому что я обновлю, если потребуется.

+0

Не похож на FMX.Platform предлагает эту информацию –

ответ

17

Для Windows вы можете использовать функцию WinAPi GetUserName, для 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.Это решение предназначено для Windows и Linux, но вам нужно проверить исходный код Delphi, если он поддерживается.

+0

Фантастически простой (DXE3 и Win10), спасибо. GetEnvironmentVariable дает так много информации. +1. – Johnny

Смежные вопросы