Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Может ли сервис windows создавать окна


Автор: InvalidProperty 15.10.2009, 11:35
Хай,

пишу Windows service. Требуется, чтобы этот service создавал окно, которое будет принимать сообщения. Кто-нибудь сталкивался с такой проблемой? В сервисе пишу MessageBox, либо CreateWindow, либо DialogBox, вроде бы функция завершается успешно, однако я ничего не вижу на экране.

Все это нужно для того, чтобы окно сервиса получало сообщения от другой аппликации.

Автор: jonie 15.10.2009, 14:04
InvalidProperty, вообще это крайне нерекомендуется. В настройках запуска сервиса есть галка "разрешить взаимодействие с рабочим столом".
Лучше сделайте отдельную програмку-клиента и на сервисереализуйте сервер собственно.. например используйте именованые папы или TCP ...

Автор: xvr 15.10.2009, 16:47
Начиная с Висты даже
Цитата

галка "разрешить взаимодействие с рабочим столом".
не поможет. MS начисто отрубила все взаимодействие сервисов с User Desktop (только MessageBox, и то не уверен  smile )

Автор: DrHex 15.10.2009, 18:01
InvalidProperty вдумайся в название  СЕРВИС а не процесс.......

Автор: InvalidProperty 16.10.2009, 10:31
DrHex, а ты вежливый.

В общем, сделал следующим образом:
в ответ на определенную команду сервис создает поток, в котором создается окно
Код

LRESULT CALLBACK clUpdater::WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
 switch(msg)
 {
  case WM_USER + 1:
  {
   dpService::cLog->Write("%s", "Yuppiiiii!!!!!!");
  }
   break;

  case WM_DESTROY:
   PostQuitMessage(0);
   break;

  default:
   break;
 }

 return(DefWindowProc(hwnd, msg, wparam, lparam));
}

void __cdecl clUpdater::UpdaterThread(void *arg)
{
 clUpdater        *self = static_cast<clUpdater *>(arg);

 MSG            msg;

 self->_hwnd = CreateWindowEx(NULL, UPDATE_WINDOW_CLASS, "MW", WS_POPUP,
                       0, 0, 0, 0, NULL, NULL, g_hInstance, NULL);
 if(!self->_hwnd)
 {
  self->_bIsStarted = false;
  SetEvent(self->_evnt);
  return;
 }

 self->_bIsStarted = true;
 SetEvent(self->_evnt);

 while(GetMessage(&msg, NULL, 0, 0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
}

void clUpdater::Start()
{
 this->Clear();

 _evnt = CreateEvent(0, FALSE, FALSE, "clUpdater::Start");

 long int tid = _beginthread(clUpdater::UpdaterThread, 0, (void *)this);
 if(tid == -1)
 {
  CloseHandle(_evnt);
  throw CharException("%s", TXT_CANNOT_START_UPDATER_THREAD);
 }
 WaitForSingleObject(_evnt, INFINITE);
 CloseHandle(_evnt);

 if(!_bIsStarted)
  throw CharException("%s", TXT_CANNOT_START_UPDATER);


 SendMessage(_hwnd, WM_USER + 1, 0, 0);

 _hTid = (HANDLE)tid;
}


пробовал запустить сей код под XP и под Вистой. На обеих операционках в лог пишется строка "Yuppiiiii!!!!!!", что говорит о том, что окно создается и получает сообщение WM_USER + 1.

Автор: xvr 16.10.2009, 12:25
Цитата(InvalidProperty @ 16.10.2009,  10:31)
пробовал запустить сей код под XP и под Вистой. На обеих операционках в лог пишется строка "Yuppiiiii!!!!!!", что говорит о том, что окно создается и получает сообщение WM_USER + 1.

Оно создается и получает все сообщения, только его невидно. Винда его создает на невидимом десктопе и на неинтерактивной WindowsStation  smile Так что облом.


Автор: RapMan 16.10.2009, 12:32
а поменять Desktop и WindowsStation - не реально? smile 
кликаем http://msdn.microsoft.com/en-us/library/ms686232(VS.85).aspx и http://msdn.microsoft.com/en-us/library/ms686250(VS.85).aspx
Думаю как открыть декстоп и стайшн найдете

Автор: InvalidProperty 16.10.2009, 13:09
не заморачивайтесь, мне нужно было создать именно невидимое окно, главное, чтобы оно принимало сообщения, чтобы сервис их мог обрабатывать

Автор: jonie 16.10.2009, 13:23
InvalidProperty, ежели оно будет на другом рабочем столе, то оно не примент сообщения от юзера например.

Автор: xvr 16.10.2009, 13:31
Цитата(RapMan @ 16.10.2009,  12:32)
а поменять Desktop и WindowsStation - не реально? smile 

Нереально
Цитата

Думаю как открыть декстоп и стайшн найдете
Не дает оно их открыть - нет прав  smile 

Автор: RapMan 16.10.2009, 16:53
Цитата(xvr @  16.10.2009,  13:31 Найти цитируемый пост)
Не дает оно их открыть - нет прав  

зависит с какими привилегиями вы работаете, вот если у тебя SYSTEM - тебе все дают  smile 

Автор: xvr 16.10.2009, 17:40
Цитата(RapMan @ 16.10.2009,  16:53)
Цитата(xvr @  16.10.2009,  13:31 Найти цитируемый пост)
Не дает оно их открыть - нет прав  

зависит с какими привилегиями вы работаете, вот если у тебя SYSTEM - тебе все дают  smile

Неа, не дают. Даже с SYSTEM. Проверено  smile 

Автор: InvalidProperty 16.10.2009, 17:45
Цитата(jonie @  16.10.2009,  13:23 Найти цитируемый пост)
InvalidProperty, ежели оно будет на другом рабочем столе, то оно не примент сообщения от юзера например. 

мне не нужно получать от юзера. Ежу понятно, что ничего от юзера не будет приниматься, если юзер даже окна не видит. Мне нужно, чтобы по созданному хэндлу можно было посылать сообщения.

Автор: RapMan 17.10.2009, 08:50
xvr, тогда моя программа не должна была работать... проверено от ХР до 7. Может вы что не так пишете?

Автор: xvr 17.10.2009, 09:57
Цитата(RapMan @ 17.10.2009,  08:50)
xvr, тогда моя программа не должна была работать... проверено от ХР до 7. Может вы что не так пишете?

Запусти свою программу (надеюсь это сервис) без галки 'Разрешить взаимодействовать с десктопом', все увидишь. 
Смотри http://msdn.microsoft.com/en-us/library/ms683502%28VS.85%29.aspx
И еще -
Цитата

However, note that the following registry key contains a value, NoInteractiveServices, that controls the effect of SERVICE_INTERACTIVE_PROCESS:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

The NoInteractiveServices value defaults to 0, which means that services with SERVICE_INTERACTIVE_PROCESS are allowed to run interactively. When NoInteractiveServices is set to a nonzero value, no service started thereafter is allowed to run interactively, regardless of whether it has SERVICE_INTERACTIVE_PROCESS.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)