У меня есть программа, которая переключает рабочий стол и запускает новый процесс на нем.Когда процесс завершается, родительский процесс восстанавливает исходный рабочий стол.
В целях тестирования я поместил кнопку в простое приложение 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 для 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?