极难问题:菜鸟想问如何实现如下功能,我的程序运行之后,如果用户10分钟没有动鼠标、键盘,程序将自动关闭,如何实现??给菜鸟发个例子也行,chenglong567

  • 主题发起人 主题发起人 xiaoxiami1
  • 开始时间 开始时间
X

xiaoxiami1

Unregistered / Unconfirmed
GUEST, unregistred user!
极难问题:菜鸟想问如何实现如下功能,我的程序运行之后,如果用户10分钟没有动鼠标、键盘,程序将自动关闭,如何实现??给菜鸟发个例子也行,chenglong5678@163.com (140分)<br />极难问题:菜鸟想问如何实现如下功能,我的程序运行之后,如果用户10分钟没有动鼠标、键盘,程序将自动关闭,如何实现??
 
给你一篇文章:

监测系统多少时间没有用户输入

系统空闲时间检测 Idle
我们知道,当用户超过一定的时间没有输入之后,Windows就会启动屏幕保护功能,那么在程序中如何做到这一点呢?就是说我如何检测到用户多久没有输入呢?大家知道,在Windows中有一个Hook技术,就是钩子,我们利用Hook技术,Hook键盘和鼠标,这样就可以知道用户有没有输入了!因此,我们可以修改Timer控件,继承下来就可以了:
用法:
if IdleTimer1.Snooze&gt;6000 then
ShowMessage('用户已经有6秒钟没有输入了!');
///FileName:IdleTimer.Pas
unit IdleTimer;

interface

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

type
TIdleTimer = class(TTimer)
private
function GetSnooze: Longint;
procedure SetSnooze(const Value: Longint);
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
property Snooze:Longint read GetSnooze write SetSnooze;
published
{ Published declarations }
end;

procedure Register;

implementation

var
Instances:integer;
ElapsedTime:Longint;
whKeyBoard,whMouse:HHook;

procedure Register;
begin
RegisterComponents('System', [TIdleTimer]);
end;

{ TIdleTimer }

function MouseHookCallBack(Code:integer;Msg:lParam;MouseHook:wParam):DWORD;stdcall;
begin
if Code&gt;=0 then ElapsedTime :=GetTickCount;
Result := CallNextHookEx(whMouse,Code,Msg,MouseHook);
end;

function KeyBoardCallBack(Code:integer;Msg:word;KeyBoardHook:Longint):LongInt;stdcall;
begin
if Code&gt;=0 then ElapsedTime :=GetTickCount;
Result := CallNextHookEx(whKeyBoard,Code,Msg,KeyBoardHook);
end;

constructor TIdleTimer.Create(AOwner: TComponent);
function GetModuleHandleFromInstance:THandle;
var
s:array[0..512] of char;
begin
GetModuleFileName(HInstance,s,SizeOf(s)-1);
Result :=GetModuleHandle(s);
end;

begin
inherited Create(AOwner);
Inc(Instances);
if Instances =1 then begin
ElapsedTime :=GetTickCount;
whMouse := SetWindowsHookEx(WH_MOUSE,@MouseHookCallback,GetModuleHandleFromInstance,0);
whKeyBoard :=SetWindowsHookEx(WH_KEYBOARD,@KeyBoardCallBack,GetModuleHandleFromInstance,0);
end;
end;

destructor TIdleTimer.Destroy;
begin
Dec(Instances);
if Instances =0 then begin
UnhookWindowsHookEx(whKeyBoard);
UnhookWindowsHookEx(whMouse);
end;
inherited;
end;

function TIdleTimer.GetSnooze: Longint;
begin
Result:= GetTickCount - ElapsedTime;
end;

procedure TIdleTimer.SetSnooze(const Value: Longint);
begin
ElapsedTime := GetTickCount + Value;
end;

end.


 
大侠,这个对于菜鸟过于高深,不知怎么把他加入到自己的程序当中去,您还是发我个程序的例子
吧,我的信箱是chenglong5678@163.com
 
已经把详细用法发到你的信箱了!
 
1. Form 上放个 Timer 组件,Interval 属性设为 600000, Enabled 属性设为 True

2. Form 的 KeyPreview 属性设为 True

3. 在 Form 的 OnKeyDown 和 OnMouseMove 中写如下代码:
Timer1.Enabled := False;
Timer1.Enabled := True;

4. 在 Timer 的 OnTimer 写代码:
Close;

qiuliang@163.com
http://www.nicesoft.net
 
多谢vine,Qiuliang。
Qiuliang大侠的太简单了!!
 
不懂,请发个使用例子。
laoyajin@elong.com
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部