【问题标题】:Detecting that the user is away from the PC with .NET使用 .NET 检测用户离开 PC
【发布时间】:2010-12-23 05:41:55
【问题描述】:

我有一个桌面应用程序,我想知道两件事:

  1. 用户当前是否在 PC 上(更具体地说,他是否向 PC 提供了任何输入),因此如果需要,我可以将他的状态更改为“离开”;和
  2. 屏幕保护程序现在是否正在运行,因此我可以在此期间执行更多 CPU 密集型工作。

我正在使用 C#/.NET。您建议如何处理这两项任务?

注意:WIN32 调用和任何非托管代码解决方案一样好。

【问题讨论】:

    标签: c# .net user-input screensaver


    【解决方案1】:

    http://dataerror.blogspot.com/2005/02/detect-windows-idle-time.html

    ^ 检测 Windows 空闲时间。 :)

    此功能的启用者是GetLastInputInfo() Win32 API 和 LASTINPUTINFO Win32 结构。

    【讨论】:

    • 链接不是答案——好吧,至少不再是。关于 SO 的答案预计是独立的。请review this meta question 并在您的答案中添加足够的细节,使其不完全依赖外部链接。也许是代码示例? (这个答案被标记为不是答案。)
    • @Charles - 我知道,但我早在 2010 年就写了这篇文章。我想我当时刚刚加入 SO,没有人向我指出“链接不是答案”信息。 :)
    • 没错,那时候的标准没有那么严格……但是,这个答案仍然被标记,改进它可能是一个好主意。
    • @Charles - 我同意,但我在工作时无法更新它。需要阅读链接和问题,所以今晚会更新答案。无论如何都是好主意,以防链接失效,内容仍然可用。 :)
    【解决方案2】:

    这是检测屏幕保护程序是否正在运行的代码。详情请见this

    const int SPI_GETSCREENSAVERRUNNING = 114;
    
    [DllImport( "user32.dll", CharSet = CharSet.Auto )]
    private static extern bool SystemParametersInfo( 
       int uAction, int uParam, ref bool lpvParam, 
       int flags );
    
    
    // Returns TRUE if the screen saver is actually running
    public static bool GetScreenSaverRunning( )
    {
       bool isRunning = false;
    
       SystemParametersInfo( SPI_GETSCREENSAVERRUNNING, 0, 
          ref isRunning, 0 );
       return isRunning;
    }
    

    【讨论】:

    • 我认为这不起作用,但后来我明白了原因:如果你预览屏幕保护程序它不起作用!它必须自动触发。因此,要对此进行测试,请将屏幕保护程序设置为 1 分钟并等待。 :)
    【解决方案3】:

    与其弄清楚何时运行更密集的工作...考虑尽可能早地进行“密集工作”,但线程优先级较低。

    我认为你的问题在纯 C# 中没有答案,除非你轮询鼠标位置并观察移动......或类似的东西。

    【讨论】:

      【解决方案4】:

      您可以使用全局键盘/鼠标挂钩,并在收到来自任一事件的事件时将“计数器”重置为 0。当您的计数器达到您正在寻找的空闲时间时,执行您的后台操作。

      这里有一些代码可以让您轻松地在 .NET 中进行挂钩:http://www.codeproject.com/KB/cs/globalhook.aspx

      【讨论】:

      • 虽然这可行,但按照 Phill 的回答建议使用 GetLastInputInfo function 比自己处理所有这些要容易得多。
      猜你喜欢
      • 2016-09-13
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多