设置线程桌面:ERROR_INVALID_HANDLE

SetThreadDesktop: ERROR_INVALID_HANDLE

为什么每次执行下面的代码时,SetThreadDesktop() 都会失败并显示以下消息:

ERROR_INVALID_HANDLE

新桌面创建成功,表示打开句柄

发生什么事了?

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Windows,
  SysUtils;

var
  _hDesk: HDESK;

begin
  try
    _hDesk := OpenDesktop('test', 0, True, GENERIC_ALL);

  if _hDesk = 0 then
    CreateDesktop('test', nil, nil, 0, GENERIC_ALL, nil);

  if not SetThreadDesktop(_hDesk) then
  begin
    Writeln(SysErrorMessage(GetLastError));
  end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

CreateDesktop returns一个句柄。您需要使用该句柄将线程切换到桌面。

_hDesk := CreateDesktop('test', nil, nil, 0, GENERIC_ALL, nil);

另外一定要检查函数是否成功,查看文档了解如何。