procedure TForm1.Button8Click(Sender: TObject);
var
ATrayHandle: HWND;
ATrayThreadProcessID: DWORD;
ATrayProcessHandle: THandle;
AUserToken: THandle;
function _GetSpecialFolder(const CSIDL: integer; AUser: THANDLE) : string;
var
RecPath : PWideChar;
begin
result := '';
RecPath := WideStrAlloc(MAX_PATH);
try
FillChar(RecPath^, MAX_PATH, 0);
if SHGetFolderPathW(0, CSIDL, AUser, 0, RecPath) = 0 then result := RecPath;
finally
StrDispose(RecPath);
end;
end;
begin
AUserToken := 0;
ATrayHandle := FindWindow('Shell_TrayWnd', nil);
if ATrayHandle <> 0 then begin
if GetWindowThreadProcessId(ATrayHandle, @ATrayThreadProcessID) <> 0 then begin
ATrayProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, ATrayThreadProcessID);
if not OpenProcessToken(ATrayProcessHandle, TOKEN_QUERY, AUserToken) then begin
if GetLastError = ERROR_NO_TOKEN then begin
OpenProcessToken(ATrayHandle, TOKEN_QUERY, AUserToken);
end;
end;
end;
end;
ShowMessage(_GetSpecialFolder(CSIDL_DESKTOPDIRECTORY, AUserToken));
end;