Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать что пользователь не работает с программой уже... [D2005, XP]


laok ©   (2006-10-02 12:37:00) 

... n-ое время? это нужно для обновления данных из файлов, но не очень удобно делать это в процессе работы - чуточку подтормаживает. Хотелось бы, чтобы если пользователь не работает скажем 1 минуту, происходил бы запуск задачи... где-то видел, найти не могу...


X9   (2006-10-02 17:17:00) [1]


> Игорь Шевченко ©   (02.10.06 13:00) [4]
>
> X9 ©   (02.10.06 12:54) [3]
>
> И что это даст ? У TApplication нету события "Idle закончился",
>  на котором при твоем способе этот таймер должен сбрасываться.
>

Ловить сообщения ввода, что Вы и сделали в [7].


Ketmar   (2006-10-02 14:20:00) [2]

>[6] laok 2-Oct-2006, 13:10
>я не умею запускать отдельные процедуры с низким
>приоритетом :-[
более того: это даже ОС не умеет. только потоки.


Игорь Шевченко   (2006-10-02 13:40:00) [3]

Пример работает:

object fMain: TfMain
 Left = 192
 Top = 107
 Width = 696
 Height = 480
 Caption = 'fMain'
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'MS Sans Serif'
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 PixelsPerInch = 96
 TextHeight = 13
 object ApplicationEvents: TApplicationEvents
   OnIdle = ApplicationEventsIdle
   Left = 20
   Top = 24
 end
 object Timer: TTimer
   Enabled = False
   Interval = 60000
   OnTimer = TimerTimer
   Left = 20
   Top = 60
 end
end


unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 AppEvnts, ExtCtrls;

type
 TfMain = class(TForm)
   ApplicationEvents: TApplicationEvents;
   Timer: TTimer;
   procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
   procedure FormCreate(Sender: TObject);
   procedure TimerTimer(Sender: TObject);
 end;

var
 fMain: TfMain;

implementation

{$R *.DFM}

procedure TfMain.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin
 Timer.Enabled := true;
end;

function MouseHookProc (code: Integer; wParam: WPARAM;
 lParam: LPARAM): LRESULT; stdcall;
begin
 if code >= 0 then
   fMain.Timer.Enabled := false;
 Result := CallNextHookEx(WH_MOUSE, code, wParam, lParam);
end;

function KbdHookProc (code: Integer; wParam: WPARAM;
 lParam: LPARAM): LRESULT; stdcall;
begin
 if code >= 0 then
   fMain.Timer.Enabled := false;
 Result := CallNextHookEx(WH_KEYBOARD, code, wParam, lParam);
end;

procedure TfMain.FormCreate(Sender: TObject);
begin
 SetWindowsHookEx(WH_KEYBOARD, KbdHookProc, 0, GetCurrentThreadId);
 SetWindowsHookEx(WH_MOUSE, MouseHookProc, 0, GetCurrentThreadId);
end;

procedure TfMain.TimerTimer(Sender: TObject);
begin
 ShowMessage ('Процесс запущен');
end;

end.


laok   (2006-10-02 13:10:00) [4]

SergP. ты думаешь я зря сюда написал? я не умею запускать отдельные процедуры с низким приоритетом :-[


SergP.   (2006-10-02 13:08:00) [5]

> laok   (02.10.06 12:37)
> ... n-ое время? это нужно для обновления данных из файлов,
> но не очень удобно делать это в процессе работы - чуточку
> подтормаживает. Хотелось бы, чтобы если пользователь не
> работает скажем 1 минуту, происходил бы запуск задачи...
> где-то видел, найти не могу...


Хм. А если запускать обновление с низким приоритетом?


Игорь Шевченко   (2006-10-02 13:00:00) [6]

X9 ©   (02.10.06 12:54) [3]

И что это даст ? У TApplication нету события "Idle закончился", на котором при твоем способе этот таймер должен сбрасываться.

laok   (02.10.06 12:54) [2]

Кроме идеи поставить хук WH_MOUSE + WH_KEYBOARD в твоем приложении больше никаких идей в голову не приходит.


laok   (2006-10-02 12:54:00) [7]

Не совсем то. Мне нужно, чтобы это распространялось только на десктоп программы, а когда пользователь вне её и так обновление происходит - прога висит в значке.


X9   (2006-10-02 12:54:00) [8]

У объекта Application есть событие OnIdle, можно запускать таймер в его обработчике.


Игорь Шевченко   (2006-10-02 12:51:00) [9]

GetLastInputInfo

Пример в http://kladovka.net.ru/download.cgi?id=19


Наверх

Титульная страница Поиск, карта сайта Написать письмо