怎么检测用户多长时间没有鼠标与键盘操作

怎么检测用户多长时间没有鼠标与键盘操作

如何检测用户多长时间没有鼠标与键盘操作?
如何检测用户多长时间没有鼠标与键盘操作?   就像屏保一样.  

我的程序要实现用户在设定的时间内没有操作,就自动锁定程序.

------解决方案--------------------
用键盘和鼠标钩子就行了!
------解决方案--------------------
同意楼上
------解决方案--------------------
procedure TForm1.Timer1Timer(Sender: TObject);
var
vLastInputInfo: TLastInputInfo;
begin
vLastInputInfo.cbSize := SizeOf(TLastInputInfo);
GetLastInputInfo(vLastInputInfo);
Caption := Format( '用户已经%d秒没有动键盘鼠标了 ',
[(GetTickCount - vLastInputInfo.dwTime) div 1000]);
end;

------解决方案--------------------
小弟佩服!
------解决方案--------------------
mark
------解决方案--------------------
我想大概的思路是看鼠标和键盘有没有发出移动和按下的事件消息吧..

你查查看能不能消息来处理这样的事件....
------解决方案--------------------
注意GetLastInputInfo在Win2000以后才有。
------解决方案--------------------
var
Form1: TForm1;
RecordHook: HHOOK; // 钩子句柄
Timer: Integer = 0; // 累计时间, 秒为单位
State: Boolean = TRUE; // 是否 '在线 '
//=========
Msg: TMsg;
WndClass: TWndClass;
HMainWnd: HWND;
implementation

{$R *.dfm}
// 窗体函数
function WindowProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
MousePos: TPoint; // 鼠标位置
begin
case (uMsg) of
WM_TIMER:
if (State = TRUE) then
begin
Inc(Timer);
if (Timer > = 5) then // 超过5秒认为离开
begin
State := FALSE;
form1.Button1.Caption:= '离开了 ';
end;
end;
end;
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
end;

// 钩子函数
function JournalRecordProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
Msg: LongWord;
begin
if (nCode = HC_ACTION) then // lParam 指向消息结构
begin
Msg := PEventMsg(lParam)^.message;
if ( (Msg > = WM_KEYFIRST) and (Msg <= WM_KEYLAST) ) or // 键盘消息
( (Msg > = WM_MOUSEFIRST) and (Msg <= WM_MOUSELAST) ) then // 鼠标消息
begin
Timer := 0;
if (State = FALSE) then // '离开 ' -> '在线 '
begin
State := TRUE;
form1.Button1.Caption:= '回来了 ';
end;
end;
end;
Result := CallNextHookEx(RecordHook, nCode, wParam, lParam); // 下一个钩子
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// 卸载钩子
UnHookWindowsHookEx(RecordHook);
// 删除时钟
KillTimer(HMainWnd, 6);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
// 安装时钟
SetTimer(HMainWnd, 6, 1000, nil);

// 安装钩子
RecordHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalRecordProc, HInstance, 0);

// 消息循环
while GetMessage(Msg, 0, 0, 0) do
begin
if (Msg.message = WM_CANCELJOURNAL) then // 此时需要重新挂钩
RecordHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalRecordProc, HInstance, 0)
else
DispatchMessage(Msg);
end;
end;

end.


大概是这样...

转载于:https://my.oschina.net/u/582827/blog/207007

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值