за все эти годы, со всем моим кол-вом сообщений, это лишь третья тема, созданная мной на васме ) да, так что сразу к делу: когда твоё приложение запущено как системный сервис, его дефолтный десктоп принадлежит соответственно NT_AUTHORITY, от которого он запущен, потому окна, создаваемые процессом все создаются там же, и юзер их наблюдать не имеет возможности. в win5 эта проблема решалась просто: Код (Text): bool setthrdsk(){ SetProcessWindowStation(OpenWindowStation("Winsta0", FALSE, WINSTA_READSCREEN)); return SetThreadDesktop(OpenDesktop("Default", NULL, FALSE, READ_CONTROL |DESKTOP_CREATEWINDOW)); } но после висты система сервисов пережила значительные изменения, и они, к несчастью, коснулись и этой проблемы. если так же поменять десктоп в вин7, и попытаться создать окно, получится примерно следующая картина: объявляется Interactive Services Detection, который предлагает переключиться на сервисную winsta и поглядеть - чего же там от юзера хотят. на самом деле уже два дня мучаюсь, и даже замучался. сам UI0Detect для переключения десктопов использует WinStationGetSessionIds, WinStationRevertFromServicesSession, и WinStationSwitchToServicesSession из winsta.dll (спасибо грейту), но загвоздка в том, что ни прототипов, ни хедеров, ни экзамплов в интернетах я как ни старался - так и не нашёл. использование их наугад, поглядывая на разреверсеный UI0Detect.exe не дало никаких результатов: Код (Text): PutAProc4("winsta",WinStationSwitchToServicesSession,DWORD,()); DBGV(p,WinStationSwitchToServicesSession); DWORD res=WinStationSwitchToServicesSession(); DBGV(d,res); /* тут код создания окна, контролов, обработка сообщений, все дела потом идёт разрушение окна и, собственно, возврат к родной winsta: */ DWORD (*WinStationRevertFromServicesSession)(char*,DWORD,char*,DWORD,DWORD,DWORD); PutAProc2("winsta",WinStationRevertFromServicesSession); DBGV(p,WinStationRevertFromServicesSession); res=WinStationRevertFromServicesSession("{EF0F4B22-39FC-4902-A2FA-57A0730A2A7C}", 0, "My desktop", 0, 1, 20); DBGV(d,res); прошу помощи, у кого какие идеи?
То есть вариант "сервис + гуи-клиент", ненавязчиво насаждаемый Microsoft - не устраивает? Семёрки под рукой пока нет, проверить не на чем. Есть предположение, что WinStationSwitchToServicesSession надо бы выполнять из кода, запущенного в пользовательской сессии, с помощью CreateProcessAsUser или CreateProcessWithTokenW. Ссылочка в тему: http://www.codeproject.com/KB/vista-security/interaction-in-vista.aspx
Да, запуск приложения в сессии пользователя и дальнейшее общение юзера с приложением, а приложения с сервисом – это каноническое решение проблемы интеракции сервиса с юзером. На самом деле именно это и делает UI0Detect, когда создаёт самокопию и выводит табличку с запросом на скольжение. >Есть предположение, что WinStationSwitchToServicesSession надо бы выполнять из кода, запущенного в пользовательской сессии. Мы тоже так подумали – однако лог показывает, что вряд ли (UI0Detect из пользовательской сессии – ограниченный процесс): Код (Text): >sc create notehole binPath= C:\sys\notepad.exe type= own type= interact >sc start ui0detect >sc start notehole Process 2692 started by parent 3324 [cmd.exe] running in session 1 with name \Windows\System32\sc.exe. Process 4752 started by parent 500 [services.exe] running in session 0 with name \bin\Notepad++\notepad++.exe. Process 2016 started by parent 2620 [ui0detect.exe, session0] running in session 1 with name \Windows\System32\UI0Detect.exe. ; ; Здесь нам предлагают переход и мы соглашаемся. ; Process 4752 [notepad++.exe] stopped at time 2010-03-24T20:48:25.274414000Z with exit code 0. ; ; А ^здесь мы закрываем notepad, находясь в нулевой сессии. ; Кстати, это только у нас модифицированы параметры, или же на w7 UI0Detect по умолчанию стоит в режиме ручного запуска (и, соответственно, ничего не детектит)?
не, у меня тоже Manually стоит, но запускается когда того требуется. спасибо за линки, сегодня буду почитать. а насчёт канонического - это, КСОжалению, немножко не подходит - уж слишком определённой тематики проект я пишу .)
м, на линке с codeproject я уже был, и даже предпринял попытки заставить это работать, но почему-то ничего полезного из этого по какой-то причине не вышло, насколько я помню.