Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.005 c
15-1261465203
MonoLife
2009-12-22 10:00
2010.03.07
Кто-нибудь пользуется yahoo почтой?


10-1163588110
312kbps
2006-11-15 13:55
2010.03.07
Получить конект через IDispatch !


1-1239373349
buzb
2009-04-10 18:22
2010.03.07
Проблема с прозрачностью в Bitmap


2-1262463589
AntonioBanderas
2010-01-02 23:19
2010.03.07
Принадлежность точки отрезку


4-1229864623
Максим
2008-12-21 16:03
2010.03.07
взаимодействие с проводником windows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский