Используйте SetThreadDesktop()
, чтобы изменить контекст потока в вашем сервисе на рабочий стол пользователя.
SetThreadDesktop()
переводит дескриптор на рабочий стол в качестве первого параметра;чтобы получить эту ручку, используйте EnumDesktops()
. EnumDesktops()
берет дескриптор оконной станции в качестве первого параметра;чтобы получить этот дескриптор, используйте EnumWindowStations()
Чтобы понять, что происходит с оконными станциями и рабочими столами, попробуйте прочитать этот обзор из MSDN.
Будьте осторожны с этой техникой.Процессы с более высоким уровнем привилегий (например, сервисы), взаимодействующие с рабочим столом пользователя, являются основой для разрушительных атак .Вам нужно написать отдельное приложение, которое запускается в контексте пользователя и взаимодействует с вашим сервисом по каналам или аналогичным.