У меня такая проблема. При создании сетевой службы Network Service Винда не позволяет использовать MessageBox, ShowWindow, ... Проблема-то ясна (сетевые службы грузятся до входа пользователя в систему), но как её решить я пока не пойму. Кто решал задачи такого рода, пожалуйста подскажите. Искал в SDK, нашёл тупой код на C++ для MessageBox, который у меня не идёт (см. в аттаче). Ещё раз. При загрузке моей NetWork Service нужно показать какое-нибудь окно (не MessageBox) приветствия, как в Novel'е, но как это сделать не пойму. _1007179947__Interacting with the User in a Service.rar
Vasil Решить твою задачу без ручной загрузки win32k.sys да еще драйвера дисплея невозможно. Поскольку последние даже не присутствуют в памяти. Что в принципе не совсем реально.
Но ведь драйвер есть драйвер. Он запускается до моей службы. В аттаче ведь написан способ для показа MessageBox, а от MessageBox до ShowWindow всего-ничего. Мне хотя бы сам принцип понять, а там дело - ПЕТРУХА...
Vasil Теперь помедленей. 1) У тебя получаеться вызов MessageBox-a ? 2) Ты понял что этот код делает? 3) Откуда увереность что окно не создаёться? То что ты его не видиш, это не аргумент. С помощью OutputDebugString проверь что говорит вызов API. 4) Код (Text): //Чтоб создать окно на роб.столе Winlogon //нужно вызвать этот код до создания окна, //иначе система откажеться подключить поток к роб.столу. HDESK hdesk = CreateDesktop( "WinSta0\\Winlogon", NULL, NULL, NULL, GENERIC_ALL, NULL ); SetThreadDesktop( hdesk ); CloseDesktop( hdesk ); Для примера: этот код емулирует нажатие Ctrl+Alt+Delete Код (Text): #define LPARAM_WINLOG 0x2e0003 HWND hwnd_ctrl_alt_del; HDESK hdesk_winlog = OpenDesktop( "Winlogon", 0, FALSE, MAXIMUM_ALLOWED ); SetThreadDesktop( hdesk_winlog ); hwnd_ctrl_alt_del = ::FindWindow( "SAS window class", "SAS window" ); CloseDesktop( hdesk_winlog ); ::PostMessage( hwnd_ctrl_alt_del, WM_HOTKEY, 0, LPARAM_WINLOG );
Может это и совсем из другой оперы, но при создании сервиса ты ему флаг SERVICE_INTERACTIVE_PROCESS в параметре dwServiceType указал? (это в функции CreateService). вот пример регистрации интерактивного сервиса: schService=CreateService( schSCManager, MyServiceName, MyServiceName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, "svcman.exe", NULL, NULL, "", NULL, NULL ); В МСДН по этому поводу так сказано: "Enables a service application process to interact with the desktop. This value is valid only if lpServiceStartName is the LocalSystem account. For more information, see Interactive Services."