Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки в формах и службах 
:(
    Опции темы
boobie
Дата 14.1.2014, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Добрый день!
Чем отличается поведение потока (простого, объекта класса THread), если его создает не окно, а служба.
Есть такой простенький поток:
Код

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs,
  Vcl.ExtCtrls;

type
  mypot = class(TThread)
  private
    { Private declarations }
  protected
    s,s2:string;
    i:integer;
    procedure Execute; override;
  end;

implementation

uses Unit1;

{ mypot }


procedure mypot.Execute;
begin
  { Place thread code here }
  i:=0;
  while terminated=false do
  begin
  Synchronize(
      procedure
      begin
        inc(i);
        s2:=s2+inttostr(i)+' ';

        if getasynckeystate($8)<>0 then
        begin
        s:=s+'BACKSPACE';
        end;

        if getasynckeystate($0d)<>0 then
        begin
       s:=s+'enter';
        end;
      end
      );
    sleep(100);
  end;
end;

end.



Так вот, если я его запускаю в оконном приложении, то все работает как надо - поток работает, getasynckeystate - перехватывает клавиши, (перехват идет всегда: свернуто приложение или развернуто, в фокусе оно или невидимо).
А если я этот поток запускаю из службы, то перехват не работает. Работает только счетчик
Код

inc(i);
        s2:=s2+inttostr(i)+' ';

Что не так?
Т.е. создаю службу и с параметрами
ServiceType - stWin32
StartType - stAuto
Код

procedure TMySluzhba.ServiceExecute(Sender: TService);
begin

  timer1.Enabled:=true;
  p1:=mypot.Create(true);
  p1.Priority:=tpnormal;
  p1.Start;
  repeat
  sleep(1);
  until (terminated=true);
end;

П.С. В потоке, на самом деле, я использую переменные из MySluzhba, но работает только счетчик, энтер с бэкспэйсом не ловятся. Еще есть таймер, который заканчивает выполнение потока через 100 секунд и записывает все строки в файл.

Это сообщение отредактировал(а) boobie - 14.1.2014, 08:36
PM   Вверх
Illusion Dolphin
Дата 14.1.2014, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Из доков:
Цитата

Windows NT/2000/XP: The return value is zero for the following cases:

    The current desktop is not the active desktop
    The foreground thread belongs to another process and the desktop does not allow the hook or the journal record.



--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
kami
Дата 14.1.2014, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(boobie @  14.1.2014,  08:04 Найти цитируемый пост)
Есть такой простенький поток:

Выбросьте его и юзайте таймер. Зачем нужен поток, если всё, что он выполняет - это вызывает Synchronize?
PM MAIL WWW   Вверх
boobie
Дата 14.1.2014, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Illusion Dolphin, 
Т.е. если рабочий стол не активен или приоритета не хватает и рабочий стол блокирует?

Так почему с обычным приложением проходит, т.е. я сворачиваю его (или вообще делаю невидимым), набираю в блокноте, а getasynckeystate в потоке все видит... А тут? Это из-за того, что служба стартует вместе с системой? 

Как это обойти? Хуки помогут?

Это сообщение отредактировал(а) boobie - 14.1.2014, 10:13
PM   Вверх
Illusion Dolphin
Дата 14.1.2014, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Так почему с обычным приложением проходит, т.е. я сворачиваю его (или вообще делаю невидимым), набираю в блокноте, а getasynckeystate в потоке все видит... 

Вы всё равно в активном десктопе.

Цитата

Как это обойти? Хуки помогут?

Легально начиная с Vista никак вроде, в любом случае дожно быть приложение в вашем активном десктопе. 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
boobie
Дата 14.1.2014, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Получатся, что голые службы вообще не могут использовать 
Код

getasynckeystate
?
А хуками могут пользоваться?

Это сообщение отредактировал(а) boobie - 14.1.2014, 13:16
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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