Комментарии достаточно подробны, чтобы указать причину, EnumWindows
перечисляет по сеансам.
Создание пользовательского сервиса - выполнимый метод. И следующий метод также эффективен:
TCHAR Command[MAX_PATH] = L"C:\\EnumWindows.exe";
DWORD sessionIdDw = WTSGetActiveConsoleSessionId();
logfile(sessionIdDw);
HANDLE hToken;
if (!WTSQueryUserToken(sessionIdDw, &hToken))
LOG() << "WTSQueryUserToken failed: " << GetLastError();
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
if(!CreateProcessAsUser(hToken,NULL,Command,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
LOG() << "CreateProcessAsUser failed: " << GetLastError();
else
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
Новый процесс выполняется в сеансе пользователя.
РЕДАКТИРОВАТЬ:
Спасибо @Eryk за указание, Оконные станции :
Каждый сеанс связан с собственной интерактивной оконной станцией
SetThreadDesktop
:
Рабочий стол должен быть связан с текущей станцией окна для процесса.
SetProcessWindowStation
:
Станция окна должна бытьсвязан с текущим сеансом.
Так что SetThreadDesktop
здесь не работает.