一系统有前台收银界面,客户要求自定义n分钟如果没有鼠标或键盘动作就锁定当前收银界面,直到有鼠标或键盘动作弹出密码输入当前操作员的密码,然后继续操作,注意:不能调用系统默认屏保输入密码,因为屏保即使有输入密码,所有操作都是一样的,我现在的问题是:放一个timer计时器,什么时机开始计时,怎么知道没有进行键盘或鼠标动作,激活times计时,怎么知道有鼠标或键盘动作。来截止截止计时,弹出密码输入框

解决方案 »

  1.   

    某思路如下:
    用Timer,当当前焦点转移时开始计时(焦点问题要调用API[或主界面的OnDeActivate?]),在预定时间内程序未得到“焦点”时,尝试:
    for n:=0 to Controlcount-1 do
      Controls[n].Enabled:=false;
    在主界面的 OnActivate 事件中 解锁
     
      

  2.   

    直接disable整个窗体就可以了, 具体代码自己网上搜搜
      

  3.   

    to:ADelphiCoder ,
    我也知道用timer,然后所有控件disabled,当当前焦点转移时开始计时,如果我的焦点一直不离开呢,突然有事人离开,焦点还在某一控件,完全有可能,你的思路有点简单,没有实际意义,细细想一下就知道,明显的为做程序而写程序,没有考虑实际操作,你把所有控件都disabled了,因为但前按钮本来就有enabled和disabled的,比如,新增按钮不可用,保存可用,等你恢复时候咋办,全部enabled?细节没有考虑到to:fanren945 
    我问的是怎么判断,什么时候开始几时没有键盘或鼠标动作请继续讨论
      

  4.   

    什么时机开始计时,怎么知道没有进行键盘或鼠标动作,激活times计时,怎么知道有鼠标或键盘动作。来截止截止计时,弹出密码输入框用Hook来钩住鼠标键盘,用时钟来测试多长没有鼠标键盘操作,这样可以解决鼠标键盘动作.
    截止输入:可以弹出密码输入框,ShowModal就可以了.
      

  5.   

    挂钩吧,要实现计时功能,调用API:SetTimer,具体参数查SDK...
    像屏保、MSN都有你所说的那些功能,具体实现都是要调用API...1L我说的那样能解决问题,不过确实过于“简单”,
      

  6.   

    计时器一直开着,设置一个程序级全局变量(boolean型)标识有没有动作,在鼠标、键盘的事件里改写这个全局变量,计时器则到时判断这个变量,用挂钩实现“在鼠标、键盘的事件里改写这个全局变量”这样的功能也行,我不太清楚挂钩~~
      

  7.   

    可以在Application的OnIdle事件中激活Timer控件。
      

  8.   

    var   
      vLastInputInfo:   TLastInputInfo;
    begin
      Label1.Caption := TimeToStr(Now);
      vLastInputInfo.cbSize   :=   SizeOf(vLastInputInfo);
      GetLastInputInfo(vLastInputInfo);
      if GetTickCount - vLastInputInfo.dwTime > 200000 then
      begin
        if not Assigned(form2) then
         begin
           form2:=Tform2.Create(Application);
           form2.ShowModal;
           form2 := nil
         end;
    end;