windows – 在用户解锁会话后,SwitchDesktop无法正常工作的原因
我有一个程序可以切换桌面并在其上启动一个新进程.进程退出时,父进程将还原原始桌面.
出于测试目的,我在一个触发切换的普通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? 解决方法
当桌面被锁定时,它会切换到为此目的保留的另一个桌面.很可能当您收到消息时,该桌面仍然处于控制状态,并且您不允许切换,因为您没有在当前桌面上运行.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在Windows中,应用程序事件日志中有哪些默认事件源可用?
- 克隆 – 适用于Windows的最佳服务器类幻像工具
- windows-phone-7 – 多长时间调用SpriteBatch.Begin()/.End
- 如何在Windows上填充虚拟磁盘的可用空间以获得更好的压缩?
- windows – 在许多登录尝试失败后自动阻止IP地址
- Hyper-V线程优先级主持人和访客 – 它们如何对应?
- windows – keras plot_model告诉我安装pydot
- Windows Phone 7 – WP7列表框滚动不工作
- windows-server-2008 – GPO中计算机配置和用户配置的区别
- windows – 您能否精确控制SCSM 2012中SCOM CI连接器的内容
- .net – 何时将代码分成新的程序集(DLL)
- windows-server-2008-r2 – localhost上的Enter-
- 强制删除Windows服务
- Windows 8 – Windows 8 Store Apps和Windows Ph
- 如何通过MSI升级安装程序WIX bootstrapper bundl
- 普通exe文件与.net Windows应用程序生成的exe文件
- 你如何得到一个像闹钟中所示类型的列表选择器?
- windows-services – 卸载Windows服务时,已安装的
- windows-7 – 在Windows 7 64位上安装SQL Server
- windows-server-2008 – 忽略主机文件的Squid代理