Как установить нить в Windows Рабочий стол по умолчанию из Winlogon - PullRequest
0 голосов
/ 30 января 2020

TL; DR Я пишу приложение для удаленного рабочего стола, и у меня возникают проблемы с входом пользователя в систему и захватом рабочего стола по умолчанию с помощью DXGI; В настоящее время я могу захватить только заставку рабочего стола.

Здравствуйте! Я пишу C приложение, которое использует DXGI для захвата рабочего стола удаленного компьютера (например, TeamViewer или VN C). Следуя этим постам ( 1 ) ( 2 ) и исходному коду TightVN C, я написал следующий код, который открывает станцию ​​Windows и рабочий стол и предоставляет доступ к потоку на рабочий стол:

  BOOL logon = LogonUser("username",
            NULL,
            "password",
            LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT,
            &hToken);

  hwinsta = OpenWindowStation("winsta0",
                              FALSE,
                              GENERIC_ALL);

  BOOL process = SetProcessWindowStation(hwinsta);  
  HDESK hdesk = OpenInputDesktop(0,
                      FALSE,
                      GENERIC_ALL);
  SetThreadDesktop(hdesk);

После этого я вызываю DXGI (как задокументировано [здесь] ), но записанный вывод - это экранная заставка Windows (несмотря на мой успешный вызов функция LogonUser()). Я попытался вручную установить рабочий стол на рабочий стол по умолчанию с помощью

  HDESK hdesk = OpenDesktop("default",
                      0,
                      FALSE,
                      GENERIC_ALL);

, но при этом функция DuplicateOutput() завершается ошибкой с 0x80070005, что является ошибкой ACCESS_DENIED.

вопрос:

Кто-нибудь имеет представление о том, что я мог бы сделать по-другому, чтобы войти в систему пользователя и переключиться через рабочий стол с заставкой / winlogon на рабочий стол по умолчанию?

Спасибо!

...