Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2012, 16:34   #1
Denutrror
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 59
Радость TService. Найти окно используя службу.

Hello.

Сегодня наткнулся на то, что называется Службами Windows (я надеюсь оно так называется). Решил написать простенький сервис для подсчёта времени активности окна, и сразу же наткнулся на проблему:
Сервис не может найти окно, хотя простое приложение используя ту же функцию запросто его находит.

Вот код, так яснее:

Код:
type
  TMyService21 = class(TService)
    Timer1: TTimer;

procedure TMyService21.ServiceExecute(Sender: TService);
begin
While not terminated do  {как я понял: чтобы приложение не было закрыто, как зависшее}
begin
sleep(2000);
ServiceThread.ProcessRequests(false);
end;
end;

procedure TMyService21.Timer1Timer(Sender: TObject);
begin
Mailw:= findwindow('ContactsHostWindow',nil);   {Вот тут и кроется проблема, программа не находит окно (хотя оно точно есть)
if mailw <> 0 then
begin
 beep;
Timer1.enabled:= false;
 end
 else
 begin
 beep;
 sleep(200);
 beep;
  end;
end;
Подскажите в чём проблема.
И ещё хотелось бы узнать что обозначает этот кусок: ServiceThread.ProcessRequests(false ).

Заранее благодарен.
Denutrror вне форума Ответить с цитированием
Старый 25.08.2012, 17:05   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Подскажите в чём проблема.
ИМХО в том что таймер срабатывает как сообщение для окна, коего служба не имеет.
Выведи твой код по обработке окна ContactsHostWindow в цикл ServiceExecute.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.08.2012, 17:44   #3
Denutrror
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
ИМХО в том что таймер срабатывает как сообщение для окна, коего служба не имеет.
Выведи твой код по обработке окна ContactsHostWindow в цикл ServiceExecute.
Не получилось

Пробовал так:
Код:
procedure TMyService21.ServiceExecute(Sender: TService);
var
toga: boolean;
begin
While not terminated do
begin
Mailw:= findwindow('ContactsHostWindow',nil);
if mailw <> 0 then
begin
 beep;
 toga:= true;
 end
 else
 begin
 beep;
 sleep(200);
 beep;
  end;
sleep(2000);
ServiceThread.ProcessRequests(false);
end;
end;
и так:
Код:
procedure TMyService21.ServiceExecute(Sender: TService);
var
toga: boolean;
begin
repeat
Mailw:= findwindow('ContactsHostWindow',nil);
if mailw <> 0 then
begin
 beep;
 toga:= true;
 end
 else
 begin
 beep;
 sleep(200);
 beep;
  end;
  until toga = false;
While not terminated do
begin
sleep(2000);
ServiceThread.ProcessRequests(false);
end;
end;
Может я что-то не то делаю, но ничего не выходит. Нет даже "отрицательного" результата!
Denutrror вне форума Ответить с цитированием
Старый 27.08.2012, 10:40   #4
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Цитата:
окна, коего служба не имеет
Имеет. Не сама служба, разумеется, а основной поток VCL-сервис-приложения - в нем в ходе инициализации объекта Forms.Application создается окно далее в методе TServiceApplication.Run организуется цикл выборки/диспетчеризации оконных сообщений.
Так что таймер, шмякнутый прямо на TService, будет нормально тикать.

Цитата:
ничего не выходит
Значит на текущем десктопе нет верхнеуровневого окна с именем ContactsHostWindow.

Цитата:
что обозначает этот кусок: ServiceThread.ProcessRequests(false )
Вызов метода-диспетчера управляющих и пользовательских сообщений потоку текущей службы.
xoodoo вне форума Ответить с цитированием
Старый 27.08.2012, 21:55   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Службы работают изолировано от оконных приложений интерактивных ользователей (в XP и младше - отдельный рабочий стол, в Vista и выше - целая изолированная сессия). Просто так работать с окнами не получится. И не нужно.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти количество четных чисел в массиве не используя операцию деления Дмитр Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 17.03.2012 21:03
найти площадь треугольника, используя функцию ele29 Паскаль, Turbo Pascal, PascalABC.NET 3 19.01.2012 16:51
Программно найти окно nikolas0 Общие вопросы Delphi 11 14.01.2011 01:45
Как используя Delphi найти процесс, который отвечает за определенное действие Minvay Общие вопросы Delphi 10 19.03.2009 12:41
Найти окно MediaPlayer DeDoK Win Api 2 11.11.2008 19:30