Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Может ли сервис windows создавать окна, Может ли сервис windows создавать окна 
V
    Опции темы
InvalidProperty
Дата 15.10.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

Репутация: 1
Всего: 9



Хай,

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

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


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
jonie
Дата 15.10.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 15.10.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Начиная с Висты даже
Цитата

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

PM MAIL   Вверх
DrHex
Дата 15.10.2009, 18:01 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



InvalidProperty вдумайся в название  СЕРВИС а не процесс.......
--------------------
google.com и это все.
PM MAIL   Вверх
InvalidProperty
Дата 16.10.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

Репутация: 1
Всего: 9



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.


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
xvr
Дата 16.10.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



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

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


PM MAIL   Вверх
RapMan
Дата 16.10.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



а поменять Desktop и WindowsStation - не реально? smile 
кликаем SetProcessWindowStation  и SetThreadDesktop
Думаю как открыть декстоп и стайшн найдете
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
InvalidProperty
Дата 16.10.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

Репутация: 1
Всего: 9



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


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
jonie
Дата 16.10.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



InvalidProperty, ежели оно будет на другом рабочем столе, то оно не примент сообщения от юзера например.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 16.10.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



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

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

Думаю как открыть декстоп и стайшн найдете
Не дает оно их открыть - нет прав  smile 
PM MAIL   Вверх
RapMan
Дата 16.10.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



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

зависит с какими привилегиями вы работаете, вот если у тебя SYSTEM - тебе все дают  smile 
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
xvr
Дата 16.10.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



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

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

Неа, не дают. Даже с SYSTEM. Проверено  smile 
PM MAIL   Вверх
InvalidProperty
Дата 16.10.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

Репутация: 1
Всего: 9



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

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


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
RapMan
Дата 17.10.2009, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



xvr, тогда моя программа не должна была работать... проверено от ХР до 7. Может вы что не так пишете?
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
xvr
Дата 17.10.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



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

Запусти свою программу (надеюсь это сервис) без галки 'Разрешить взаимодействовать с десктопом', все увидишь. 
Смотри Интерактивные Сервисы
И еще -
Цитата

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.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1041 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.