Вечер добрый. Подскажите пожалуйста, как ввести меседжбокс из сервиса? Нагуглил такой код: Код (Text): DWORD dwGuiThreadId = 0; int UserMessageBox(RPC_BINDING_HANDLE h, LPSTR lpszWindowStation, LPSTR lpszDesktop, LPSTR lpszText, LPSTR lpszTitle, UINT fuStyle) { DWORD dwThreadId; HWINSTA hwinstaSave; HDESK hdeskSave; HWINSTA hwinstaUser; HDESK hdeskUser; int result; // Ensure connection to service window station and desktop, and // save their handles. GetDesktopWindow(); hwinstaSave = GetProcessWindowStation(); dwThreadId = GetCurrentThreadId(); hdeskSave = GetThreadDesktop(dwThreadId); // Impersonate the client and connect to the User's // window station and desktop. RpcImpersonateClient(h); hwinstaUser = OpenWindowStation(lpszWindowStation, FALSE, MAXIMUM_ALLOWED); if (hwinstaUser == NULL) { RpcRevertToSelf(); return 0; } SetProcessWindowStation(hwinstaUser); hdeskUser = OpenDesktop(lpszDesktop, 0, FALSE, MAXIMUM_ALLOWED); RpcRevertToSelf(); if (hdeskUser == NULL) { SetProcessWindowStation(hwinstaSave); CloseWindowStation(hwinstaUser); return 0; } SetThreadDesktop(hdeskUser); // Display message box. dwGuiThreadId = dwThreadId; result = MessageBox(NULL, lpszText, lpszTitle, fuStyle); dwGuiThreadId = 0; // Restore window station and desktop. SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); CloseDesktop(hdeskUser); CloseWindowStation(hwinstaUser); return result; } Но какие параметры ему передавать - не знаю. Заранее благодарен.
Начиная с Vista сервис запускается в отдельной сессии с отдельным десктопом. Так что твой MessageBox никто не увидит.
bug1z Вроде ж все делают отдельное приложение для показывания юзеру гуя, которое общается с сервисом?
То есть из сервиса вызывать CreateProcessAsUser() с правами обычного пользователя и в потоке этого процесса выполнять мой код?
Не подойдет, поскольку там может быть не только месдж бокс. нужен именно десктоп залогиненого пользователя. А как создавать процесс из под сервиса так, чтобы он располагал десктопом залогиненого пользователя? Ипользовал CreateProcessAsUser(), но все равно на десктопе пользователя ничего не выводилось.
Не надо извращений. Что, например, будет делать сервис, если залогиненных юзеров несколько? Или ни одного? Нормальные люди делают еще одно обычное десктопное приложение, которое сидит на десктопе юзера (неважно, загружается ли оно через HKCU\...\Run, или юзер запускает его самостоятельно) и ждет, пока сервис не отправит ему команду вывести мессаджбокс.
WTSQueryUserToken отдаст токен того юзера, который в данный момент поключен к физической консоли(клаве и дисплею), а не просто залогинен.