VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1104|回复: 7

如何检测用户多长时间没有鼠标与键盘操作?

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-2 09:00:02 | 显示全部楼层 |阅读模式
如何检测用户多长时间没有鼠标与键盘操作? 就像屏保一样.

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

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-7-15 09:00:01 | 显示全部楼层
用键盘和鼠标钩子就行了!
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-15 21:45:01 | 显示全部楼层
同意楼上
回复

使用道具 举报

0

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-7-19 19:15:01 | 显示全部楼层
procedure TForm1.Timer1Timer(Sender: TObject);
var
  vLastInputInfo: TLastInputInfo;
begin
  vLastInputInfo.cbSize := SizeOf(TLastInputInfo);
  GetLastInputInfo(vLastInputInfo);
  Caption := Format('用户已经%d秒没有动键盘鼠标了',
    [(GetTickCount - vLastInputInfo.dwTime) div 1000]);
end;
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-7-27 17:30:01 | 显示全部楼层
小弟佩服!
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-29 15:45:01 | 显示全部楼层
我想大概的思路是看鼠标和键盘有没有发出移动和按下的事件消息吧..

   你查查看能不能消息来处理这样的事件....
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-31 17:30:01 | 显示全部楼层
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.


大概是这样...
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-3 15:00:01 | 显示全部楼层
usefull
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表