我的做法是写一个定时器,1秒钟计数器加一次,加到60就弹出一个窗口:from1.show 1因为是模态窗口,用户必须关闭这个窗口才能继续操作,就达到了锁定的目的。如果用户操作了鼠标或者键盘就将计数器置0现在的问题是每个窗口的好多地方需要写置0语句,很麻烦。有没有一种方法从最底层检测呢?屏幕保护的程序也是等待15分钟没有操作,就自动唤醒的,它怎样实现的呢?恳求高手指教,谢谢!

解决方案 »

  1.   

    你得用API去检测鼠标与键盘的事件再在主窗体中用timer就可以了啊
      

  2.   

    API?哪个API检测鼠标和键盘的动作?
      

  3.   

    Declare Function GetInputState Lib "user32" Alias "GetInputState" () As Long
    用这个试试,判断当前的鼠标键盘输入状态。
    以前在书上看过,记得不很清楚。希望能帮你
      

  4.   

    sdrcxzy(大向) 的方法很简单,就用他的没错。
    检测代码就写在TIMER里面。
      

  5.   

    如果是指对整个操作系统没有输入,用(仅适用于 NT 系统):Private Declare Function GetLastInputInfo Lib "user32" (plii As LASTINPUTINFO) As Boolean
    Private Declare Function GetTickCount Lib "kernel32" () As Long
    Private Type LASTINPUTINFO
        cbSize As Long
        dwTime As Long
    End Type
    Dim lii As LASTINPUTINFO
    Private Sub Timer1_Timer()
    lii.cbSize = Len(lii)
    GetLastInputInfo lii
    Debug.Print GetTickCount - lii.dwTime & "ms"
    End Sub
      

  6.   

    如果检查是否一段事件没有操作你的窗体了:(适用于各种操作系统)
    Dim IdleTime As IntegerPrivate Sub Form_Load()
        Me.KeyPreview = True
    End SubPrivate Sub Form_KeyDown(......)
        IdleTime = 0
    End SubPrivate Sub Form_MouseMove()
        IdleTime = 0
    End SubPrivate Sub Timer1_Timer()
        IdleTime = IdleTime + 1
        If IdleTime = 60 Then ......
    End Sub
      

  7.   

    首先谢谢大家的回答。如果是指对整个操作系统没有输入,用(仅适用于 NT 系统):Private Declare Function GetLastInputInfo Lib "user32" (plii As LASTINPUTINFO) As Boolean
    =======================================================================================这个方法我试了的确有效,但是有它限制了我写的软件只能运行在NT平台上,win98就不行了,但是win98的屏幕保护是如何实现的呢?如果检查是否一段事件没有操作你的窗体了:(适用于各种操作系统)
    Dim IdleTime As Integer
    =================================================================
    这个正是我目前采用的方法,但是你有没有发现,如果窗体上有其他的控件,比如图片,比如表格,比如按钮,Form_MouseMove就不能检测到,必须写Image1_MouseMove事件处理;Command1_MouseMove事件处理,很麻烦,而且容易漏掉,程序变得臃肿。windows的操作系统的屏幕保护的唤醒,
    绝对不会在每个应用程序里面写 计数器置0的语句,它到底如何实现的?
      

  8.   

    首先谢谢大家的回答。如果是指对整个操作系统没有输入,用(仅适用于 NT 系统):Private Declare Function GetLastInputInfo Lib "user32" (plii As LASTINPUTINFO) As Boolean
    =======================================================================================这个方法我试了的确有效,但是有它限制了我写的软件只能运行在NT平台上,win98就不行了,但是win98的屏幕保护是如何实现的呢?如果检查是否一段事件没有操作你的窗体了:(适用于各种操作系统)
    Dim IdleTime As Integer
    =================================================================
    这个正是我目前采用的方法,但是你有没有发现,如果窗体上有其他的控件,比如图片,比如表格,比如按钮,Form_MouseMove就不能检测到,必须写Image1_MouseMove事件处理;Command1_MouseMove事件处理,很麻烦,而且容易漏掉,程序变得臃肿。windows的操作系统的屏幕保护的唤醒,
    绝对不会在每个应用程序里面写 计数器置0的语句,它到底如何实现的?
      

  9.   

    Option Explicit
    Private Declare Function GetInputState Lib "user32" () As LongPrivate Sub Form_Load()
        Timer1.Interval = 1000
        Timer1.Enabled = True
    End SubPrivate Sub Timer1_Timer()
        Debug.Print GetInputState
    End Sub结果不管键盘和鼠标是否动过, 每次输出的都是0,
      

  10.   

    GetLastInputInfo 函数声明不对.
    http://www.vckbase.com/document/viewdoc/?id=567
    Windows中如何获取键盘和鼠标处于空闲状态的时间
      

  11.   

    感谢 laviewpbt(人一定要靠自己) 的回答,我也想到过用回调函数,键盘鼠标钩子。但是我担心我的程序如果意外崩溃出错,可能对系统造成不稳定。再等等看还有没有其他办法,难道屏幕保护的唤醒也是钩子的作用吗?