Форум: "Начинающим";
Текущий архив: 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