当鼠标和键盘5分钟没有动作的时候,自动执行ChildForm.BringtoFront怎么实现?(100分)

小羽

Unregistered / Unconfirmed
GUEST, unregistred user!
当鼠标和键盘5分钟没有动作的时候,自动执行ChildForm.BringtoFront怎么实现?
 
设一个全局变量 i (计时用),在鼠标的按下和移动、主窗口键盘按下事件(主窗口keypreview=true)将此变量i:=0;
在timer(1000毫秒触发)下写事件:
begin
inc(i);
if i=300 then//5分钟
begin
ChildForm.BringtoFront;//你的事件
end;
end;
 
这样做不行,因为在别的子窗体操作的时候,这样就不管事了,是不是要截获鼠标键盘的消息呢?
 
是不是一个特定的子窗口当鼠标和键盘5分钟没有动作的时候将一个特定的子窗口BringtoFront,还是别的?
 
对,有好多子窗口,用户随意使用,当鼠标键盘闲置5分钟的时候,将这个特定的子窗口BringToFront.
 
用TApplication.OnIdle 试一下,我也没试过。
 
TApplication.OnIdle 也不行。因为只要你的程序没
事干,TApplication.OnIdle 就会发生。
看来只能用全局Hook了。
 
所有窗口从一个窗口类继承,该窗口类如果有鼠标或者键盘动作,
就把一个static(或者全局变量)TDateTime变量赋成now。

在TApplication.OnIdle中检查是否闲置了五分钟。
 
该怎么用呢?Hook,怎么使?
 
你检索一下以前的文章,我记得有使用Hook的文章,创建键盘和鼠标的Hook,分别
监视动作,就好办了。
 
我正检索着呢,别客气帮我贴上来好吗?
 
Application.OnMessage:= AppOnMessage;

procedure OnIdle;
begin
Timer1.Interval:=1000*60*5;
Timer1.Enabled:=True;
end;

procedure AppOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
if (Msg.message = WM_MOUSEMOVE) or (Msg.message = WM_KEYDOWN) then
begin
Timer1.Enabled:=false;
Timer1.Interval:=1000*60*5;
Timer1.Enabled:=True;
end;
end;
然后响应 Timer1OnTime 处理。我没试,想的。
 
谢谢小雨哥。
 
用钩子。
 
我给你一个控件,完成 5 分钟没有动作的时候给你一个事件。
 
好,快,ye_cheng1@163.com 有多大?
 
急,急,急!
 
按小雨哥的思路好像可以了,我在试试然后再给大家贴上来。
 
1.先在project文件里application.run前写application.onmessage:=MainForm.AppMessageHandler;
2.再在MainForm中定义AppMessageHandler:
public
procedure AppMessageHandler(var Msg:TMsg;var Handled:Boolean);
........

procedure TMainForm.AppMessageHandler(var Msg:TMsg;var Handled:Boolean);
begin
if (msg.message=WM_MOUSEMOVE) or (msg.message=WM_KEYDOWN) then timer1.tag:=0;
end;
3.Timer1中写
....
timer1.tag:=timer1.tag+1;
if Timer1.tag=300 then childForm.bringtofront;
.....
OK...

 
顶部