windows - 是什么导致 SwitchDesktop 在用户解锁 session 后无法立即工作?

标签 windows winapi wtsapi32

我有一个程序可以切换桌面并在其上启动一个新进程。当进程退出时,父进程恢复原来的桌面。

出于测试目的,我在触发切换的普通 win32 应用程序中放置了一个按钮。它有效,并关闭启动的进程(记事本),我回到原来的桌面。

在同一个程序中,我调用了 WTSRegisterSessionNotification 以在 session 解锁 (WTS_SESSION_UNLOCK) 时接收通知。我收到了。

但是当我尝试在 WTS_SESSION_UNLOCK 消息处理程序中切换桌面时,SwitchDesktop 失败并且 GetLastError 为 0。文档说最后一个错误通常不是由 SwitchDesktop 设置。

有趣的是,如果我将切换桌面的调用放在 for 循环中,它会在第 5 次迭代时起作用。

简而言之,这是行不通的:

    case WM_WTSSESSION_CHANGE:
      if(wParam == WTS_SESSION_UNLOCK)          
      {
          SwitchDesktop(a_valid_desktop_handle);
      }
    break;

但是这个丑陋的 hack 起作用了:

    case WM_WTSSESSION_CHANGE:
      if(wParam == WTS_SESSION_UNLOCK)          
      {
         for(int i=0; i<10; ++i)
         {
            if(SwitchDesktop(a_valid_desktop_handle))
            {
                //This will work when i == 5, maybe 6.
                break;
            }
         }
      }
    break;

设置一个计时器(退出消息循环)也可以,但对于这个问题,它只是一种更复杂的循环形式。 SwitchDesktop 将在少量 WM_TIMER 消息后继续工作。它看起来像常数时间,虽然我没有测量它。

MSDN documentation for SwitchDesktop提到这将因我使用的自定义 Userinit 进程而失败。但是在切换之前获取当前桌面的名称:

wchar_t name[512];
GetUserObjectInformation(GetThreadDesktop(GetCurrentThreadId()), UOI_NAME, name, sizeof(name)/sizeof(*name), 0);
OutputDebugString(name);

一直给我 default。由于 GetLastError 是 0,而不是 5(访问被拒绝),我很确定安全桌面在我收到 WTS_SESSION_UNLOCK 通知之前已经消失。

我知道在锁屏状态下不能切换桌面,但在桌面解锁后是否有一个“宽限期”不能调用 SwitchDesktop ?

最佳答案

当桌面被锁定时,它会切换到另一个为此目的保留的桌面。很有可能当您收到该消息时,该桌面仍在控制中并且不允许您切换,因为您未在当前桌面中运行。

关于windows - 是什么导致 SwitchDesktop 在用户解锁 session 后无法立即工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8686123/

相关文章:

c++ - 如何以编程方式发送电子邮件,就像我在 Windows 资源管理器中发送 "Send To Mail Recipient"一样?

c++ - 在 Win32 应用程序中捕获 DLL 依赖项

c++ - 通过 Win32 API 更改文件夹安全权限

winapi - 如何获取物理 session 的当前用户 token ?

c - WTSRegisterSessionNotification 导致进程挂起

windows - 为什么我在 Windows 上使用 Perl-Tk 构建复杂的 GUI 时遇到问题?

python - 如何创建一个在后台运行并对键盘输入使用react的 Python 脚本?

c++ - GetUserNameExA 函数无法在系统启动时(GINA)提供用户详细信息?

windows - strftime 代码与 GetLocaleInfo 代码