使用.NET检测用户是否远离PC

时间:2010-12-23 05:41:55

标签: c# .net user-input screensaver

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

  1. 用户当前是否在PC上(更具体地说,他是否向PC提供任何输入),因此如果需要,我可以将其状态更改为“离开”;和
  2. 屏幕保护程序现在正在运行,因此我可以在此期间执行更多CPU密集型工作。
  3. 我正在使用C#/ .NET。您如何建议解决这两项任务?

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

4 个答案:

答案 0 :(得分:5)

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

^检测Windows空闲时间。 :)

  

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

答案 1 :(得分:5)

以下是检测屏幕保护程序是否正在运行的代码。有关详细信息,请参阅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;
}

答案 2 :(得分:0)

而不是确定何时运行更密集的工作......考虑尽可能早地完成“密集工作”,但线程优先级较低。

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

答案 3 :(得分:0)

您可以使用全局键盘/鼠标挂钩,只需在收到任何一个事件时将“计数器”重置为0即可。当您的计数器达到您要查找的空闲时间时,请执行后台操作。

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