一个类似MSN自动判断[离开]功能的问题(200分)

  • 主题发起人 主题发起人 chillinson
  • 开始时间 开始时间
C

chillinson

Unregistered / Unconfirmed
GUEST, unregistred user!
MSN有一个根据事先设定的时间判断用户状态为[离开]的功能,不知道是根据鼠标和键盘无活动判断?还是根据系统一个什么参数去判断?具体又可以用什么API来实现??请教一下.谢谢!
 
无键盘鼠标操作。<br>
 
用记时器应该可以吧?当有鼠标键盘操作的时候就重新从0累计时间。。<br>当累计的时间到预定的,就当作已经离开。。。。。。您看如何?
 
TO:andy263,刘麻子<br>&nbsp; &nbsp;感谢2位的回复,目前问题是不知可用什么API来监控鼠标和键盘的动作.[:(]<br>&nbsp; &nbsp;<br>
 
在Windows 2000中提供了一个新的函数:GetLastInputInfo(),这个函数使用结构 LASTINPUTINFO 作为参数: <br><br>LASTINPUTINFO lpi;<br>lpi.cbSize = sizeof(lpi);<br>GetLastInputInfo(&amp;lpi); &nbsp; &nbsp; &nbsp;<br>&nbsp; &nbsp; 调用函数GetLastInputInfo()以后, 结构成员lpi.dwTime 中的值便是自上次输入事件发生以后的毫秒数。这个值也就是键盘、鼠标处于空闲状态的时间。
 
做全局的mouse keyboard hook<br>tseug提供的方法显然更简单,记住这个函数了[:D]<br>可惜Windows 95/98/Me Unsupported<br>参阅下面函数<br>SetWindowsHookEx<br>UnHookWindowsHookEx<br>在dfw中检索一下有很多<br>
 
如果是只管本程序中鼠标键盘操作,就不需要用钩子.<br>否则,想达到屏幕保护程序那样,就要挂一个全局钩子.<br>如果不熟悉,我愿意尝试写完整的代码.
 
好像在Tapplication中有事件可以处理的。具体的你查一下。
 
程序在设置时间内没有mouse keyboard even就判断用户状态为[离开]。<br>不需要用钩子,因为你只是想判断你的程序。<br>
 
感谢以上各位高手的回复.劣者刚涉及Windows API,虽然很有兴趣,可是感觉太多迷茫.尚需更加努力修炼!<br>To:tseug<br>我试了你的方法(代码如下),得到值都很大,如46080380,而且我的系统一直都在使用,键盘鼠标都有动作,可是得到值却越来越大,不知为什么?还是哪里我没有注意到?<br>procedure TForm1.Button1Click(Sender: TObject);<br>var lpi:tagLASTINPUTINFO;<br>begin<br>&nbsp; &nbsp; &nbsp;lpi.cbSize := sizeof(lpi);<br>&nbsp; &nbsp; &nbsp;GetLastInputInfo(lpi);<br>&nbsp; &nbsp; &nbsp;showmessage(inttostr(lpi.dwTime));<br>end;<br><br>To:刘麻子<br>我要实现系统的一个监测,早就有看到很多关于钩子的讨论,如有代码那是最好不过了.<br>
 
很抱歉,大概我没有把问题说清楚,我要实现的是一个类似MSN自动判定[离开]功能,也和系统的屏幕保护程序那样的,监测系统的使用情况.
 
Tapplication OnIdle事件,程序空闲时间。。
 
我明白了,您是想 象系统中屏幕保护程序那样,<br>要系统所有的按键和鼠标操作都没有。。。。<br>好,稍等,做好后告诉您!
 
我用钩子做了一个这样的例子,告诉我你的邮箱,我发给你.
 
就是挂钩后,有鼠标或按键消息的时候,重新记时(清0),当时间到达一定的时候......
 
To:佛剑分说<br>&nbsp; &nbsp;我的邮箱是chillin@21cn.com,谢谢!
 
下面这段代码在TForm1.Button1Click添上你的qq号,运行如果一秒内不动键盘鼠标就关掉qq<br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>&nbsp; Dialogs, StdCtrls;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; Button2: TButton;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; &nbsp; procedure Button2Click(Sender: TObject);<br>&nbsp; &nbsp; procedure FormCreate(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br>&nbsp; hhk,shwnd,HT:Thandle;<br>&nbsp; i:integer;<br><br>function hookproc(ncode:integer;wparam:wparam;lparam:lparam):LRESULT;stdcall;<br>procedure timerproc(hwnd,msg,ht,time:integer);stdcall;<br>implementation<br><br>{$R *.dfm}<br>procedure timerproc(hwnd,msg,ht,time:integer);stdcall;<br>begin<br>&nbsp; &nbsp; &nbsp;sendmessage(shwnd,WM_CLOSE,0,0);<br>end;<br><br>function hookproc(ncode:integer;wparam:wparam;lparam:lparam):LRESULT;stdcall;<br>begin<br>&nbsp; &nbsp; &nbsp;if i=0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; SetTimer(form1.Handle,HT,1000,@timerproc)<br>&nbsp; &nbsp; &nbsp;else begin<br>&nbsp; &nbsp; &nbsp; &nbsp; KillTimer(form1.Handle,HT);<br>&nbsp; &nbsp; &nbsp; &nbsp; SetTimer(form1.Handle,HT,1000,@timerproc);<br>&nbsp; &nbsp; &nbsp;end;<br>&nbsp; &nbsp; &nbsp;i:=i+1;<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; &nbsp; &nbsp;shwnd:=findwindow(nil,你的qq号码);<br>&nbsp; &nbsp; &nbsp;if hhk=0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; hhk:=SetWindowsHookEx(WH_JOURNALRECORD,@hookproc,0,0);<br>end;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>begin<br>&nbsp; &nbsp; &nbsp;if hhk&lt;&gt;0 then<br>&nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp; UnHookWindowsHookEx(hhk);<br>&nbsp; &nbsp; &nbsp; &nbsp; hhk:=0;<br>&nbsp; &nbsp; &nbsp;end;<br>end;<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>&nbsp; &nbsp; &nbsp;hhk:=0;<br>&nbsp; &nbsp; &nbsp;i:=0;<br>end;<br><br>end.
 
请看一个键盘钩子小程序:ajgz.rar 在 http://www.efile.com.cn/?liumazi<br>希望对您有帮助,是我以前做的,没有您要的那种功能,但稍微改一改就可以了。
 
我觉得最理想的方法是判断 CPU 的空闲状态,能像屏保那样在优先级为 0 的线程中跑。<br>但是还是有很多问题无法解决。这是个好问题。
 
后退
顶部