Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как узнать что пользователь не работает за компом?


Автор: Hawk 9.10.2002, 18:44
Люди! Подскажите, как узнать что пользователь не работает за компом. Нужно чтобы если в течение 5 мин. пользователь бездельничает(не давит клаву и не дергает мышу), программа бы выполнила какие-то действия.

Автор: Vit 9.10.2002, 23:05
Ставишь Hook...

Автор: Hawk 9.10.2002, 23:31
А какой хук нада, и как его поставить, если можно пример, или ссылку где искать плизззз.

Автор: rhf 9.10.2002, 23:35
hook на WH_MOUSE и WH_KEYBOARD
setWindowsHookEx
на delphi.mastak.ru есть статья Hooks аспекты реализации

Автор: Hawk 9.10.2002, 23:43
СПАСИБА! :)

Автор: Medved 15.10.2002, 03:06
Поставь на форму таймер, установи свойство формы KeyPreview := true, и обрабатывай событие KeyPress. Будет работать только в том случае, если твоя форма будет активна (и такое бывает :-)

Автор: Song 15.10.2002, 22:24
TApplication.onIdle или
WM_ENTERIDLE или WM_IDLE, точно не помню.

Автор: Гость_Leo 5.2.2004, 15:09
Я вот написал прогу на Дельфях, типа системы удаленного администрирования, так там эта задача рещается просто - отслеживается только перемещение мыши - показано практикой - за минуту пользователь хотя бы раз мышь двигает, используя функцию GetCursorPos и таймер, и все, никаких тебе хуков. Работает безотказно. smile.gif

Автор: x77 5.2.2004, 15:34
некорректная постановка вопроса. что значит не работает? я могу читать текст. или полчаса любоваться порносайтом. ни мышь ни клава в такого рода "работе" не учавствуют. а узнать программно, смотрю я на монитор или нет вряд ли удасться. поэтому сначала надо конкретизировать, что понимается под работой юзера. работа определённых программ? нажатие кнопок? двигание мыши? по-большому счёту, отлавливается это так же, как это отлавливает скрин-сэйвер - т.е. OnIdle. и действительно, без всяких хуков smile.gif

Автор: Гость_Skif 28.3.2005, 15:33
Народ!!!

Срочно нужен исходник простенького скрин-сэйвера на дельфи может у кого есть или ссылочку дадите???

Автор: FRAGNATIC 28.3.2005, 16:13
Цитата
Срочно нужен исходник простенького скрин-сэйвера на дельфи может у кого есть или ссылочку дадите???

насколько я знаю в ДРКБ есть статья на эту тему
а так вот взял пример из книги "Библия Дэлфи" автор М.Флёнов
Код

unit MainUnit;

interface

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

{$D SCRNSAVE Raver}

type
  TSaverForm = class(TForm)
    Timer1: TTimer;
    procedure FormActivate(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
    BGbitmap:TBitmap;
    DC : hDC;
    BackgroundCanvas : TCanvas;
  public
    { Public declarations }
  end;

var
  SaverForm: TSaverForm;

implementation

uses OptionsUnit;


{$R *.DFM}

procedure TSaverForm.FormActivate(Sender: TObject);
begin
 Left:=0;
 Top:=0;
end;

procedure TSaverForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
 Close;
end;

procedure TSaverForm.FormDestroy(Sender: TObject);
begin
 BGBitmap.Free;
end;

procedure TSaverForm.FormPaint(Sender: TObject);
begin
 if Timer1.Enabled=true then
  Canvas.Draw(0,0,BGBitmap);
end;

procedure TSaverForm.Timer1Timer(Sender: TObject);
const
 DrawColors: array[0..7] of TColor =(clRed, clBlue, clYellow, clGreen,
                                   clAqua, clFuchsia, clMaroon, clSilver);
begin
 BGBitmap.Canvas.Pen.Color:=DrawColors[random(7)];
 BGBitmap.Canvas.MoveTo(random(Screen.Width),random(Screen.Height));
 BGBitmap.Canvas.LineTo(random(Screen.Width),random(Screen.Height));
 Canvas.Draw(0,0,BGBitmap);
end;

procedure TSaverForm.FormShow(Sender: TObject);
var
 reg:TRegIniFile;
begin
 reg := TRegIniFile.Create('Software');
 reg.OpenKey('DelphiBook',true);
 OptionsForm.PassEdit.Text:=reg.ReadString('Screen Saver', 'Password', '');
 OptionsForm.TrackBar1.Position:=reg.ReadInteger('Screen Saver', 'Timer Interval', 1000);
 reg.Free;

 if ParamCount>0 then
  begin
   if ParamStr(1)='/p' then
    begin
     Close;
     exit;
    end;
   if ParamStr(1)[2]='c' then
    begin
     OptionsForm.ShowModal;
     if OptionsForm.ModalResult=mrOK then//Если нажата кнопка ОК, то сохраняю выбранные параметры
      begin
       reg := TRegIniFile.Create('Software');
       reg.OpenKey('DelphiBook',true);
       reg.WriteString('Screen Saver', 'Password', OptionsForm.PassEdit.Text);
       reg.WriteInteger('Screen Saver', 'Timer Interval', OptionsForm.TrackBar1.Position);
       reg.Free;
      end;
     Close;
     exit;
    end;
  end;

 Timer1.Enabled:=true;
 Timer1.Interval:=OptionsForm.TrackBar1.Position;
 Width:=Screen.Width;
 Height:=Screen.Height;
end;

procedure TSaverForm.FormCreate(Sender: TObject);
begin
 Width:=0;
 Height:=0;
 BGbitmap:=TBitmap.Create;
 BGbitmap.Width := Screen.Width;
 BGbitmap.Height := Screen.Height;

 DC := GetDC (0);
 BackgroundCanvas := TCanvas.Create;
 BackgroundCanvas.Handle := DC;

 BGBitmap.Canvas.CopyRect(Rect (0, 0, Screen.Width, Screen.Height), BackgroundCanvas,
                            Rect (0, 0, Screen.Width, Screen.Height));
 BackgroundCanvas.Free;
 randomize;
end;

procedure TSaverForm.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
var
 pass:String;
begin
 if ParamStr(1)<>'/s' then //Если программа не запущена, а показываеться окно настроек то можно выходить
  begin
   CanClose:=true;//Разрешаю выход из программы
   exit;
  end;

 if OptionsForm.PassEdit.Text='' then//Если пароль пустой, то можно выходить
  begin
   CanClose:=true;//Разрешаю выход из программы
   exit;
  end;

 CanClose:=false;//Запрещяю выход из программы
 //Показываю окно ввода пароля
 pass:='';
 if InputQuery('Введите пароль', 'Пароль:', pass) then
  if pass=OptionsForm.PassEdit.Text then//Если пароль верный
   CanClose:=true;//Разрешаю выход из программы
end;

end.

и
Код

unit OptionsUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TOptionsForm = class(TForm)
    Label1: TLabel;
    PassEdit: TEdit;
    Button1: TButton;
    Button2: TButton;
    Label2: TLabel;
    PassEdit1: TEdit;
    Label3: TLabel;
    TrackBar1: TTrackBar;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  OptionsForm: TOptionsForm;

implementation

{$R *.dfm}

procedure TOptionsForm.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
 CanClose:=false;
 if PassEdit.Text=PassEdit1.Text then//Проверяю, если пароль равен подтверждению, то можно закрывать окно
  CanClose:=true
 else
  Application.MessageBox('Пароль не соответствуют подтверждению', 'Ошибка');
end;

end.

помойму проще не куда)

Автор: Poseidon 28.3.2005, 20:32
Цитата(Hawk @ 9.10.2002, 18:44)
Подскажите, как узнать что пользователь не работает за компом.
Вот тебе функция каторая возврещает время простоя системы:
Код
function LastInput: DWord;
 var
   LInput: TLastInputInfo;
 begin
   LInput.cbSize := SizeOf(TLastInputInfo);
   GetLastInputInfo(LInput);
   Result := GetTickCount - LInput.dwTime;
 end;

Возвращаемое значение в миллисекундах. Если нужно узнать сколько секунд простаивает система, то измени последнюю строчку на
Код
Result := Trunc((GetTickCount - LInput.dwTime)/1000);


Пример использования:
Код
procedure TForm1.Timer1Timer(Sender: TObject);
 begin
   Label1.Caption := Format('Система простаивает %d ms', [LastInput]);
 end;


Функция работаспособна в Windows 2000 и выше.

PS. Кстати в DRKB такого я не нашел (может и есть, не спорю). А функция ведь полезная! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)