aardio 官方社区

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
查看: 7076|回复: 6

[请教] 计算空闲时间

[复制链接]

14

主题

28

回帖

422

积分

培训班

积分
422
发表于 2017-10-29 09:42:34 | 显示全部楼层 |阅读模式
代码目的是在有鼠标或键盘输入事件时计算下上次离开到目前的空闲时间
在鼠标钩子中计算正常
在键盘钩子中空闲时间一直是0,不懂是什么原因,请大家指教!
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=759;bottom=469)
  4. winform.add()
  5. /*}}*/


  6. import console
  7. import mouse.hook;
  8. import key.hook;

  9. hkmouse = mouse.hook()
  10. hkmouse.proc = function(msg,x,y,mouseData,injected,flags,timeStamp,extraInfo){
  11.         if( injected ) return;         
  12.         var ret,info = ::User32.GetLastInputInfo( {INT size = 8;INT time} );
  13.     console.log("空闲时间:"++win.getIdleTime()  ,"本次触发时间:"++timeStamp,"上次触发时间:"++info.time)
  14.            
  15. }

  16. hkkey = key.hook();
  17. hkkey.proc = function(msg,vkcode,scancode,injected,flags,timeStamp,extraInfo){
  18.         if( injected ) return;         
  19.        
  20.         select(msg) {
  21.             case 0x100/*_WM_KEYDOWN*/ ,0x104/*_WM_SYSKEYDOWN*/{
  22.                  var ret,info = ::User32.GetLastInputInfo( {INT size = 8;INT time} );
  23.                   console.log("按下空闲时间:"++win.getIdleTime()  ,"本次触发时间:"++timeStamp,"上次触发时间:"++info.time)
  24.             }
  25.                case 0x101/*_WM_KEYUP*/,0x105/*_WM_SYSKEYUP*/{
  26.                 var ret,info = ::User32.GetLastInputInfo( {INT size = 8;INT time} );
  27.                   console.log("抬起空闲时间:"++win.getIdleTime()  ,"本次触发时间:"++timeStamp,"上次触发时间:"++info.time)
  28.             }
  29.    
  30.         }
  31. }
  32. winform.onClose = function(hwnd,message,wParam,lParam){
  33.     hkmouse.close()
  34.     hkkey.close()
  35. }

  36. winform.show();
  37. win.loopMessage();
复制代码

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-10-29 14:15:36 | 显示全部楼层
你已经按下键鼠鼠标了,就不叫空闲了,当然空闲时间是0.
键盘鼠标钩子会拖慢系统,尽量少用。

14

主题

28

回帖

422

积分

培训班

积分
422
 楼主| 发表于 2017-10-29 14:36:15 | 显示全部楼层
实现本楼示例功能有什么效率高点的方法呢?
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=759;bottom=469)
  4. winform.add()
  5. /*}}*/

  6. import console
  7. import mouse.hook;
  8. import key.hook;
  9. import win;
  10. var lasttime = 0

  11. hkmouse = mouse.hook()
  12. hkmouse.proc = function(msg,x,y,mouseData,injected,flags,timeStamp,extraInfo){
  13.         if( injected ) return;         
  14.         var ret,info = ::User32.GetLastInputInfo( {INT size = 8;INT time} );
  15.         var idle = win.getIdleTime()
  16.     if(idle > 5000){
  17.             win.msgbox("空闲了"++ idle / 1000 ++ "秒")
  18.     }  
  19.            
  20. }

  21. winform.onClose = function(hwnd,message,wParam,lParam){
  22.     hkmouse.close()
  23. }

  24. winform.show();
  25. win.loopMessage();
复制代码

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-10-29 15:05:21 | 显示全部楼层
win.getIdleTime() 就是得到系统空闲时间,
为什么你还要钩子去检测空闲时间。

14

主题

28

回帖

422

积分

培训班

积分
422
 楼主| 发表于 2017-10-29 15:31:03 | 显示全部楼层
不用钩子想不到还可以用什么方法

要指定时间内连续没有任何操作,再次触碰来电脑时才弹出提示作息
比如:离开电脑连续超过10分钟没操作后,回到电脑时提醒
9:00时离开电脑
休息15分钟
再次打开电脑时间 9:15,这时碰下鼠标弹出提示 离开了15分钟。

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-10-29 15:38:12 | 显示全部楼层
快手风雨 发表于 2017-10-29 15:31
不用钩子想不到还可以用什么方法

要指定时间内连续没有任何操作,再次触碰来电脑时才弹出提示作息

你已经得到空闲时间了,还非要去下个钩子再去计算一遍空闲时间?!

最简单的你可以用个定时器,系统已经把空闲时间,以及空闲时间的变化都告诉你了
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
edit={cls=
"edit";left=56;top=48;right=664;bottom=416;edge=1;multiline=1;z=1}
)
/*}}*/

winform.lastInputTick = win.getIdleTime()
var tmId = winform.setInterval(
    10,
function(){
        
if( win.getIdleTime() < 100 ){
            
var idle = winform.lastInputTick / 1000
            
if( idle > 1 )
                winform.edit.printf(
"电脑上次闲置了:%.2d秒",idle);
        }
        winform.lastInputTick = win.getIdleTime();
    }
)

winform.show();
win.loopMessage();

14

主题

28

回帖

422

积分

培训班

积分
422
 楼主| 发表于 2017-10-29 15:57:03 | 显示全部楼层
多谢提示,用时钟方式解决问题。代码如下 :
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=759;bottom=469)
  4. winform.add()
  5. /*}}*/


  6. import console
  7. var leave = false
  8. tmid = winform.setInterval(
  9.         1000/*毫秒*/,
  10.         function(hwnd,msg,id,tick){
  11.                 var idle = win.getIdleTime()
  12.                
  13.                 if(leave and idle < 5000){
  14.                         leave = false
  15.                         console.log("离开了"++ leaveIdle)       
  16.                         leaveIdle = 0                       
  17.                 }
  18.                
  19.                 if(idle>5000){
  20.                         leave = true
  21.                         console.log(idle)
  22.                         leaveIdle = idle
  23.                 }       
  24.         }
  25. );
  26. winform.show();
  27. win.loopMessage();
复制代码

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-6-11 20:13 , Processed in 0.071871 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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