Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.07;
Скачать: CL | DM;

Вниз

Непрерывная слежка за событием   Найти похожие ветки 

 
citizen ©   (2009-12-29 13:41) [0]

Вопрос:
Нужно непрерывно следить за одним из событий чужого запущенного приложения, например, за активностью одного из компонентов формы (если приложение не запущенно, ждем его запуска). Целесообразно ли воспользоваться в таком случае бесконечным циклом, выделив для него отдельный поток, или есть другой механизм?
Спасибо!


 
Sha ©   (2009-12-29 13:53) [1]

Если непрерывно следить, то не останется времени сообщить.
Просто мысль.


 
citizen ©   (2009-12-29 16:45) [2]

Спрашиваю я вот почему:

Ниже привел свой пример кода программы, когда нужно следить за тем, чтобы при открытом и активном окне блокнота отключать клавиатуру, а при неактивном или закрытом – включать.

program Project1;
uses
 windows,
 Messages,
 Dialogs,
 SysUtils,
 Classes;

type
   TNewThread = class(TThread)
   private
   { Private declarations }
   protected
   procedure Execute; override;
 end;

var f,h:HWND;
   off_keyboard:boolean; //-указатель отключенной клавиатуры
   Dummy: integer = 0;
   OldKbHook: HHook = 0;
   NewThread: TNewThread;

function KbHook(code: Integer; wparam: Word; lparam: LongInt): LongInt; stdcall;
begin
   if code < 0 then
     Result := CallNextHookEx(oldKbHook, code, wparam, lparam)
   else
     Result := 1;
end;

//Включить клавиатуру:
procedure KeyBoardOn;
begin
 if OldKbHook <> 0 then
   begin
        UnHookWindowshookEx(OldKbHook);
        OldKbHook := 0;
   end;
   SystemParametersInfo(SPI_SETFASTTASKSWITCH, 0, nil, 0);
   SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, nil, 0);
end;

//Выключить клавиатуру:
procedure KeyBoardOff;
begin
    SystemParametersInfo(SPI_SETFASTTASKSWITCH, 1, @Dummy, 0);
    SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, @Dummy, 0);
    OldKbHook := SetWindowsHookEx(WH_KEYBOARD, @KbHook, HInstance, 0);
end;

procedure TNewThread.Execute;
begin
 off_keyboard:=false;//-клавиатура включена
 while true do
      begin
           f:=GetForegroundWindow; //-дескриптор приоритетного окна
   h:=FindWindow(nil,"Безымянный - Notepad2"); //-дескриптор окна блокнота
           if h <> 0 then
             begin
           //Если приоритетным является окно блокнота, то выкл.клавиатуру:
                  if (f = h)and(off_keyboard = false) then
                    begin
                         KeyBoardOff;
                         off_keyboard:= true;//-клавиатура выключена
                         //ShowMessage("клавиатура выключена");
                    end;
                  //Если окно блокнота неприоритетно, то вкл.клавиатуру:
                  if (f <> h)and(off_keyboard = true) then
                    begin
                         KeyBoardOn;
                         off_keyboard:= false;//-клавиатура включена
                         //ShowMessage("клавиатура включена");
                    end
             end
             else
               //Если блокнот закрыт, а клавиатура выключена, то включить ее:
                 if (off_keyboard = true) then
                 begin
                      KeyBoardOn;
                      off_keyboard:= false;//-клавиатура включена
                 end;
                 Sleep(1);
       end;
end;
//тело программы:
begin
 NewThread:=TNewThread.Create(true);
 NewThread.FreeOnTerminate:=true;
 NewThread.Priority:=tpLower;
 NewThread.Resume;
end.


Без потока работает, но весьма нагружает систему. А с потоком – работать отказывается. Почему? И как обойтись без бесконечного цикла?


 
Медвежонок Пятачок ©   (2009-12-29 16:48) [3]

это что за ужасы? на носу вроде не хеллоуин а новый год


 
Сергей М. ©   (2009-12-29 17:01) [4]

Хук-то ты нафига ставил, тем более глобальный ?
И если уж ставишь глобальный хук WH_KEYBOARD, то с какого перепугу его реализация находится в standalone executable - модуле, а не в dll ?


 
citizen ©   (2009-12-29 17:36) [5]

Слушайте, Медвежонок Пятачок и Сергей М., оставь я здесь качественный рабочий код, тогда сисадминам не поздоровится, народ всякий бывает. Жаль коллег! Я-то спрашивал, как обойтись без бесконечного цикла в непрерывном слежении за каким-то событием, например, как в выше описанной страшилке с отключением клавиатуры в окне блокнота...


 
Медвежонок Пятачок ©   (2009-12-29 17:41) [6]

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

А с потоком – работать отказывается. Почему?

хорошая шутка для новогоднего утренника в садике.


 
citizen ©   (2009-12-29 19:01) [7]

Если не понятна суть вопроса, напоминаю, вот сабж:
Нужно непрерывно следить за одним из событий чужого запущенного приложения, например, за активностью одного из компонентов формы (если приложение не запущенно, ждем его запуска). Целесообразно ли воспользоваться в таком случае бесконечным циклом, выделив для него отдельный поток, или есть другой механизм?

А код прошу не трогать, это просто как дополнение для понятия сути вопроса, а не пиар, и на статус качественного и работоспособного не претендует и в помине, но вредоносным в очумелых ручках стать может. Вот это имелось в виду.


 
Сергей М. ©   (2009-12-29 21:32) [8]


> citizen ©   (29.12.09 17:36) [5]


> оставь я здесь качественный рабочий код, тогда сисадминам
> не поздоровится


Уж больно ты грозен, как я погляжу)

> как обойтись без бесконечного цикла


Без цикла - никак.
Или придется захреначить линейный алгоритм, реализованный в коде размером эдак на терабайт-другой)
А насчет бесконечного - у всего бывает свой конец и свое начало ..


> код прошу не трогать


Да как же его не трогать, коль в нем такая смешная ерунда ?

Никто ж не против хука в решении задачи, но нельзя же так беспардонно коверкать классическую логику и реализацию его установки/использования ..



Страницы: 1 вся ветка

Текущий архив: 2010.03.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
8-1180531137
Zeleniy
2007-05-30 17:18
2010.03.07
MediaPlayer и несколько файлов одного расширения.


6-1210590992
little_fish
2008-05-12 15:16
2010.03.07
проблема с Web-Services(HTTPRIO)


2-1262892262
Sunktor
2010-01-07 22:24
2010.03.07
Как поменять ImageList для кнопки при наведении курсора и нажатии


15-1261435653
Piter
2009-12-22 01:47
2010.03.07
Отпуск с точки зрения ТК РФ


6-1213405371
antoxa2005
2008-06-14 05:02
2010.03.07
Подскажите, а как добавить вложение к письму стандарного mail аге