加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 在用户解锁会话后,SwitchDesktop无法正常工作的原因

发布时间:2020-12-14 02:27:02 所属栏目:Windows 来源:网络整理
导读:我有一个程序可以切换桌面并在其上启动一个新进程.进程退出时,父进程将还原原始桌面. 出于测试目的,我在一个触发切换的普通win32应用程序中放了一个按钮.它工作,并关闭启动的进程(记事本),我回到原来的桌面. 在同一个程序中,我调用了WTSRegisterSessionNotif
我有一个程序可以切换桌面并在其上启动一个新进程.进程退出时,父进程将还原原始桌面.

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

在同一个程序中,我调用了WTSRegisterSessionNotification以在会话解锁时接收通知(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;

但这个丑陋的黑客有效:

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);

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

我知道在屏幕被锁定时我无法切换桌面,但桌面解锁后是否有“宽限期”,我无法调用SwitchDesktop?

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读