如题,我想判断一下鼠标静止的时间,根据此算系统待定的时间,若超过设定时间就弹出一个对话框,类似屏保的东东。
谁有这样的源程序给兄弟发一份,江湖救急。小弟在这先谢谢各位兄弟姐妹啦!!!

解决方案 »

  1.   

    写一个计时的线程,响应MouseMove消息重新计时,如果计时达到一定的时间,就启动对话框
      

  2.   

    鼠标静止?用Cpoint对象保存上一个点,然后判断当前的点是不是上各点,不是的话执行操作,是的话用SetTimer函数定义一个一段时间的计时器(这里用到一个SetTimer函数的特性,就是如果时间还没有到,又有SetTimer函数被调用的话,重新开始计时).
    如果时间到了,而又没有移动,则开始到OnTimer函数中处理消息.
      

  3.   

    MouseMove里面设置nIdle为当前时间
    做个timer得到当前时间nNow
    如果nNow-nIdle大于某个值
    就。
      

  4.   

    LZ配合Timer使用,在Timer的触发函数中使用即可
      

  5.   

    GetLastInputInfo
    The GetLastInputInfo function retrieves the time of the last input event.BOOL GetLastInputInfo(
      PLASTINPUTINFO plii   // last input event
    );
    Parameters
    plii 
    [out] Pointer to a LASTINPUTINFO structure that receives the time of the last input event. Return Values
    If the function succeeds, the return value is nonzero.If the function fails, the return value is zero. Res
    This is useful for input idle detection.<--MSDN说的多么明显,就用这个。
    ------------------------------------------------------就是这么回事。
      

  6.   

    http://www.vckbase.com/document/viewdoc/?id=567
    直接来这里 Ctrl+C Ctrl+V吧
      

  7.   

    GetLastInputInfo  GetLastInputInfo是Windows中获取键盘和鼠标空闲时间的API
      1.调用函数GetLastInputInfo()以后, 结构成员lpi.dwTime 中的值并非上次输入事件发生以后的毫秒数。而是上次输入事件发生时的系统运行时间。相当于上次输入事件发生时执行了lpi.dwTime=::GetTickCount()。::GetTickCount()-lpi.dwTime才是上次输入事件发生以后的毫秒数。
      2.如原文中所说windows2000以上系统才支持函数GetLastInputInfo()因此有可能需要在StdAfx.h中加上如下语句: 
      #ifdef _WIN32_WINNT 
      #undef _WIN32_WINNT 
      #endif 
      #define _WIN32_WINNT 0x0500 
      原文:
      在编写程序的过程中,我遇到了这样的需求:在基于Windows&reg; 9x 或Windows NT4.0
      的程序中,要求确定键盘、鼠标处于空闲状态的时间。
      查询了有关资料文档以后,发现Windows 9x和Windows NT4.0没有提供API或系统调用来实现这样的功能。但是,在Windows 2000中提供了一个新的函数:GetLastInputInfo(),这个函数使用结构 LASTINPUTINFO 作为参数:
      LASTINPUTINFO lpi;
      lpi.cbSize = sizeof(lpi);
      GetLastInputInfo(&lpi);
      调用函数GetLastInputInfo()以后, 结构成员lpi.dwTime 中的值便是自上次输入事件发生以后的毫秒数。这个值也就是键盘、鼠标处于空闲状态的时间。
      可惜的是这个函数只能在Windows 2000中使用,Windows 9x 或Windows NT4.0不提供此API函数。
      那么,如何在Windows 9x 或Windows NT4.0中实现GetLastInputInfo()的功能呢?
      笔者的方法是利用系统钩子对键盘、鼠标进行监控。
      Windows中的钩子实际上是一个回调函数,当用户有输入动作的时候,Windows要调用这个函数。比较典型的系统钩子应用就是键盘钩子和鼠标钩子,
      HHOOK g_hHookKbd = NULL;
      HHOOK g_hHookMouse = NULL;
      在Windows中,一个系统(相对于一个特定进程而言)钩子必须用一个动态链接库(DLL)来实现。不妨将这个动态链接库命名为IdleUI.dll。 这个动态链接库在Windows 9x和Windows NT4.0中实现了GetLastInputInfo()的功能。IdleUI.dll中有三个函数:
      BOOL IdleUIInit()
      void IdleUITerm();
      DWORD IdleUIGetLastInputTime();
      IdleUIInit()是环境初始化函数,IdleUITerm()是环境清理函数,分别在MFC应用程序的InitInstance() 和 ExitInstance()中调用它们。当用IdleUIInit()做完初始化后,就可以调用第三个函数IdleUIGetLastInputTime()来获取最后一次输入事件后的时钟。从而实现与GetLastInputInfo()一样的功能。
      程序TestIdleUI.exe是用来测试IdleUI动态库的,程序中调用了IdleUIInit 和 IdleUITerm,同时在程序的客户区中间显示键盘、鼠标空闲的秒数。
      void CMainFrame::OnPaint()
      {
      CPaintDC dc(this);
      CString s;
      DWORD nsec = (GetTickCount() - IdleUIGetLastInputTime())/1000;
      s.Format( "鼠标或键盘空闲 %d 秒。",nsec);
      CRect rc;
      GetClientRect(&rc);
      dc.DrawText(s, &rc, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
      }
      图一显示了TestIdleUI运行时的情形。
      图一
      为了连续的显示,TestIdleUI设置刷新定时器间隔为一秒。
      void CMainFrame::OnTimer(UINT)
      {
      Invalidate();
      UpdateWindow();
      }
      运行TestIdleUI,当键盘和鼠标什么也不做时,可以看到计时器跳动,当移动鼠标或按键时,计时器又恢复到零,这样就实现了对输入设备空闲状态的监控。实现细节请看下面对IdleUI.dll工作原理的描述:
      首先调用IdleUIInit ()进行初始化,安装两个钩子:一个用于监控鼠标输入,一个用于监控键盘输入。
      HHOOK g_hHookKbd;
      HHOOK g_hHookMouse;
      g_hHookKbd = SetWindowsHookEx(WH_KEYBOARD,
      MyKbdHook, 
      hInst, 0);
      g_hHookMouse = SetWindowsHookEx(WH_MOUSE,
      MyMouseHook, 
      hInst, 0);
      当用户移动鼠标或按下键盘键时,Windows调用其中的一个钩子并且钩子函数开始记录时间: 
      LRESULT CALLBACK MyMouseHook(int code, 
      WPARAM wp, 
      LPARAM lp)
      {
      if (code==HC_ACTION) {
      // note the tick count
      g_dwLastInputTick = GetTickCount();
      }
      return ::CallNextHookEx(g_hHookMouse,
      code, wp, lp);
      }
      如法炮制MyKbdHook。IdleUIGetLastInputTime 返回结果g_dwLastInputTick, 并且IdleUITerm 卸载两个钩子。
      这个程序中有一个细节使用了一些技巧:通常,建立一个动态链接库时,链接器将静态数据标记为非共享,也就是说,每一个调用DLL的进程都获得自己的数据拷贝------在本程序中是g_hHookKbd、g_hHookMouse和g_dwLastInputTick。当在整个进程空间中需要且只需要一个这些数据的实例时,这样的静态数据标记就不适合了,为了解决这个问题,必须实现数据共享。为此得把数据放入一个特定的段地址中,然后将它们标记为共享。实现代码如下:
      #pragma data_seg (".IdleUI") // 可以取任何别的名字
      HHOOK g_hHookKbd = NULL;
      HHOOK g_hHookMouse = NULL;
      DWORD g_dwLastInputTick = 0;
      #pragma data_seg ()
      这段代码告诉链接器将三个变量放到叫“.IdleUI”的数据段中。然后在模块定义文件.DEF中加入下面的代码来共享这个数据段:
      SECTIONS .IdleUI READ WRITE SHARED // in IdleUI.def