有什么东西可以提供系统空闲吗?我们想使用 C# 来获取系统在所有会话中的空闲时间,如果 X 分钟内没有人使用机器,则将机器注销。
关于这个的任何想法......
有什么东西可以提供系统空闲吗?我们想使用 C# 来获取系统在所有会话中的空闲时间,如果 X 分钟内没有人使用机器,则将机器注销。
关于这个的任何想法......
如果您正在运行终端服务器,这可以通过组策略或通过终端服务配置来完成
要注销桌面会话,您需要有一个在后台运行的程序(这不能作为系统服务工作,它必须作为交互式会话的一部分运行),它将检查登录时间GetLastInputInfo
,然后它可以打电话ExitWindowsEx
注销。
class Program
{
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));
[MarshalAs(UnmanagedType.U4)]
public int cbSize;
[MarshalAs(UnmanagedType.U4)]
public UInt32 dwTime;
}
[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool ExitWindowsEx(uint uFlags, uint dwReason);
static void Main(string[] args)
{
bool running = true;
while (running)
{
if (GetLastInputTime() > 60 * 15) //15 min idle time
{
ExitWindowsEx(0, 0);
running = false;
}
Thread.Sleep(1000 * 60); //check once per min.
}
}
static int GetLastInputTime()
{
int idleTime = 0;
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = Marshal.SizeOf(lastInputInfo);
lastInputInfo.dwTime = 0;
int envTicks = Environment.TickCount;
if (GetLastInputInfo(ref lastInputInfo))
{
int lastInputTick = (int)lastInputInfo.dwTime;
idleTime = envTicks - lastInputTick;
}
return ((idleTime > 0) ? (idleTime / 1000) : 0);
}
}
我需要这样做一次并且很难找到来源,这可能会帮助其他正在关注此类问题的人。因此,即使我在回答,我也对这个问题投了反对票。
更新:这是一种让它作为服务运行的技术