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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с АПИшным таймером, как отловить WM_TIMER... 
:(
    Опции темы
decoder
  Дата 11.8.2004, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

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



Использую функцию SetTimer(0,0,1000,nil)... Как я понял, ядро будет генерировать WM_TIMER и помещать его в системную очередь сообщений...
Пишу в диэлэлке хук WH_GETMESSAGE; в процедуре хука пишу
if TMsg(Pointer(lParam)^).message = WM_TIMER then тра-ля-ля
В итоге, диэлэлка работает не так, как надо...
Вопрос: поскольку проверить не могу, отлавливают WM_TIMER так или по другому?
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
_hunter
Дата 11.8.2004, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



смотря где ловить ( если в dll то так )
хотя WM_TIMER в wParam' e идет, по моему


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
decoder
Дата 11.8.2004, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

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



Тоды, я не знаю чё такое...
Короче, вот код диэлэлки:
Код

library HookTimer;

uses
 Windows, Messages;

type
 TTimers = record
   ID: Cardinal;
   Timring: Boolean;
 end;

var
 Hook: hHook;
 Timers: array of TTimers;

function Timring(Code: LongInt; wParam: Word; lParam: LongInt): LongInt; stdcall;
var
 i: Byte;
begin
 Result := CallNextHookEx(Hook, Code, wParam, lParam);
 for i := 0 to High(Timers) do
   Timers[i].Timring := False;
 if Length(Timers) > 0 then
   begin
     if TMsg(Pointer(lParam)^).message = WM_TIMER then
       for i := 0 to High(Timers) do
         if TMsg(Pointer(lParam)^).wParam = Timers[i].ID then
           begin
             Timers[i].Timring := True;
             Break;
           end;
   end;
end;

function RunStopHook(State: Boolean): Boolean; export; stdcall;
begin
 if State = True then
   begin
     Hook := SetWindowsHookEx(WH_GETMESSAGE, @Timring, hInstance, 0);
     Result := (Hook <> 0)
   end
 else
   begin
     UnhookWindowsHookEx(Hook);
     Hook := 0;
     Result := True;
   end;
end;

function IsTimring(ID: Cardinal): Boolean; export; stdcall;
var
 i: Byte;
begin
 Result := False;
 for i := 0 to High(Timers) do
   if Timers[i].ID = ID then
     Result := Timers[i].Timring;
end;

function AddTimer(ID: Cardinal): Boolean; export; stdcall;
begin
 try
   SetLength(Timers, Length(Timers) + 1);
   Timers[High(Timers)].ID := ID;
   Timers[High(Timers)].Timring := False;
   Result := True;
 except
   Result := False;
 end;
end;

function RemoveTimer(ID: Cardinal): Boolean; export; stdcall;
var
 i, j: Byte;
begin
 try
   Result := False;
   for i := 0 to High(Timers) do
     if Timers[i].ID = ID then
       begin
         for j := i to High(Timers) - 1 do
           begin
             Timers[j].ID := Timers[j + 1].ID;
             Timers[j].Timring  := Timers[j + 1].Timring;
           end;
         SetLength(Timers, High(Timers));
         Result := True;
         Break;
       end;
 except
   Result := False;
 end;
end;

exports RunStopHook;
exports AddTimer;
exports RemoveTimer;
exports IsTimring;

begin
end.

В начале создаётся таймер SetTimer(0,0,1000,nil), потом AddTimer(результат функции), потом постоянно проверяется IsTimring - таким образом реализуется таймер для нескольких приложений
Добавлено @ 18:39
плиз, помогите, кто может

Это сообщение отредактировал(а) decoder - 19.8.2004, 19:56
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
_hunter
Дата 11.8.2004, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



не совсем эффетивно
если нужно чтобы по одному таймеру что-то выполнялось в нескольих приложениях проще создать Event' ы в потоках ( в каждом приложении ) а в приложении-сервере ( в том, на которое установлен таймер ) эти Event' ы устанавливть


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
decoder
Дата 11.8.2004, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

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



У, блин, не... Я стока матерных слов в одном предложении ещё не встречал smile.gif withstupid.gif
Вобщем мне нужно именно пример SetTimer'а с первым параметром нуль и с последним - нил
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
_hunter
Дата 11.8.2004, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



попробуй записывать все приходящие сообщения в фйл и посмотри есть ли среди них твое ( от таймера )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
decoder
Дата 11.8.2004, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

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



ИМХО в инфе написано, что "всё таки она вертится", но я всё равно попробую...
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
<Spawn>
Дата 11.8.2004, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



1) Под какой осью пишешь? В Вин 9x хуки еще были криво реализованы и для их работоспособности нужно передавать хендлы хука между адресными пространствами процессов, например при помощи CreateFileMapping + MapViewOfFile
2)
Код
Timers: array of TTimers;
- хех, в каждом адресном пространстве процесса это будет совершенно разный массив - глобальные переменные нужно передавать через разделяемую память. Как смотри выше.
3)SetTimer(0,0,1000,nil) - разве Хендл окна не нужно укаывать? Как оно будет получать то сообщение. Насколько я понимаю, нужно примерно так - SetTimer(Handle, 100, 1000, nil);
4)Зачем тебе вообще это? Опиши подробнее. Может есть другой выход?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
decoder
Дата 11.8.2004, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

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



Цитата
3)SetTimer(0,0,1000,nil) - разве Хендл окна не нужно укаывать? Как оно будет получать то сообщение. Насколько я понимаю, нужно примерно так - SetTimer(Handle, 100, 1000, nil);
Читай инфу cool.gif

Цитата
4)Зачем тебе вообще это? Опиши подробнее. Может есть другой выход?
Мысль вошла в голову и упорно ищет мозг... Я статью хочу написать по апишным таймерам, и, поскольку статья должна содержать максимум информации, как говорится "Хлеба и зрелищ", нужно описать все возможные комбинации параметров описуемых функций.

--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
RA
Дата 12.8.2004, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


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

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





Код

Timer1,:cardinal;
mainwin:hwnd;     //hwnd твоего окна


..............................

killtimer(mainwin,timer1); - Убивает таймер

....................................

hwnd,1-(не помню), 20 (Интервал), твоя функция
timer1:=settimer(mainwin,1,20,@MyFunction)

....................................

mainwin:=createwindow( ........

MyFunction - Функция или процедура выполняемая таймером



PM   Вверх
decoder
Дата 12.8.2004, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

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



Та блин, знаю я это mad.gif
Цитата(decoder @ 11.8.2004, 22:10)
Мысль вошла в голову и упорно ищет мозг... Я статью хочу написать по апишным таймерам, и, поскольку статья должна содержать максимум информации, как говорится "Хлеба и зрелищ", нужно описать все возможные комбинации параметров описуемых функций.

Вот, как должна работать диэлэл:
Код


...formcreate...
id := SetTimer(0,0,1000,nil);
AddTimer(id);
RunStopHook(true);
...

...formdestroy...
RunStopHook(true);
RemoveTimer(id);
KillTimer(0,id);
...

...Buttonclick...
{обработка событий таймера}
while not exitting do
 begin
   while not IsTimring(id) do Application.ProcessMessages;
   ...
 end;
{конец обработки событий таймера}

id записываем куда-нить и в левом приложении можем тоже использовать функцию IsTimring(id)

--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
dm9
Дата 14.8.2004, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Внесу свою лепту. Может, тебе просто надо поймать WM_TIMER таким образом?

Код
TForm1 = class(TForm)
  ...
  protected
     procedure XXX (var MyMessage : TMessage); message WM_TIMER;
end;

implementation
procedure TForm1.XXX (var MyMessage : TMessage); message WM_TIMER;
begin
end;

PM MAIL ICQ   Вверх
decoder
Дата 16.8.2004, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

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



dm9 mad.gif mad.gif mad.gif Я ж, блин, использую SetTimer с параметрами 0,0,...,nil . Ты видишь, чтобы таймер привязывался к какому-то окну(первый параметр)? mad.gif mad.gif mad.gif .
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
S.A.P.
Дата 16.8.2004, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Перечитал я еще раз документацию по таймерам на API, но не нашел ни какого упоминания о том, что первый параметр можно установить в 0 sad.gif . Может какую цитату кинешь, а то я тоже что-то загорелся этой идеей smile.gif .

Может быть ты имел в виду NULL?

Цитата
hWnd

Identifies the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.


Только не ругай, если ступил withstupid.gif .
PM MAIL   Вверх
decoder
Дата 17.8.2004, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

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



Цитата(MS)
The SetTimer function creates a timer with the specified time-out value.

UINT SetTimer(

    HWND hWnd, // handle of window for timer messages
    UINT nIDEvent, // timer identifier
    UINT uElapse, // time-out value
    TIMERPROC lpTimerFunc  // address of timer procedure
  );


Parameters

hWnd

Identifies the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.

nIDEvent

Specifies a nonzero timer identifier. If the hWnd parameter is NULL, this parameter is ignored.

uElapse

Specifies the time-out value, in milliseconds.

lpTimerFunc

Points to the function to be notified when the time-out value elapses. For more information about the function, see TimerProc.
If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message's MSG structure contains the value of the hWnd parameter.


Return Values

If the function succeeds, the return value is an integer identifying the new timer. An application can pass this value, or the string identifier, if it exists, to the KillTimer function to destroy the timer. If the function fails to create a timer, the return value is zero.

Remarks

An application can process WM_TIMER messages by including a WM_TIMER case statement in the window procedure or by specifying a TimerProc callback function when creating the timer. When you specify a TimerProc callback function, the DispatchMessage function simply calls the callback function instead of the window procedure. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.

Т.е., если первый параметр равен нулю, таймер не привязывается к окну, и, если последний параметр равен nil, то WM_TIMER посылается SystemQueue...
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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