系统空闲时间-Windows服务

本文关键字:-Windows 服务 时间 系统 | 更新日期: 2023-09-27 18:28:39

我正在使用Windows服务,它需要知道本地机器空闲了多长时间。我尝试过标准的Qt方法,但由于服务是作为LocalSystem运行的,所以它不会注册本地用户活动。

当应用程序以LocalSystem运行时,有什么关于如何获得机器空闲状态的想法吗?

系统空闲时间-Windows服务

不确定这是否有帮助。来自文章:这里

由于我们使用的是非托管库,因此首先出现的是附加的using语句:

using System.Runtime.InteropServices;
// Unmanaged function from user32.dll    
[DllImport("user32.dll")]    
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
// Struct we'll need to pass to the function    
internal struct LASTINPUTINFO    
{    
    public uint cbSize;    
    public uint dwTime;    
}
private void tmrIdle_Tick(object sender, EventArgs e)    
{    
    // Get the system uptime    
    int systemUptime = Environment.TickCount;    
    // The tick at which the last input was recorded    
    int LastInputTicks = 0;    
    // The number of ticks that passed since last input    
    int IdleTicks = 0;            
    // Set the struct    
    LASTINPUTINFO LastInputInfo = new LASTINPUTINFO();    
    LastInputInfo.cbSize = (uint)Marshal.SizeOf(LastInputInfo);    
    LastInputInfo.dwTime = 0;       
    // If we have a value from the function    
    if (GetLastInputInfo(ref LastInputInfo))    
    {    
        // Get the number of ticks at the point when the last activity was seen    
        LastInputTicks = (int)LastInputInfo.dwTime;    
        // Number of idle ticks = system uptime ticks - number of ticks at last input    
        IdleTicks = systemUptime - LastInputTicks;    
    }        
    // Set the labels; divide by 1000 to transform the milliseconds to seconds    
    lblSystemUptime.Text = Convert.ToString(systemUptime / 1000) + " seconds";    
    lblIdleTime.Text = Convert.ToString(IdleTicks / 1000) + " seconds";    
    lblLastInput.Text = "At second " + Convert.ToString(LastInputTicks / 1000);    
}

我找到了两个选项。

用户模式帮助程序

  1. 它调用GetLastInputInfo()
  2. 它可以注册为"任务调度器"任务。它应该像守护进程一样持续运行
  3. 为了与服务进行通信,它可以使用对文件的写入、为HTTP提供服务,以及可能的其他IPC方法

WTSAPI+CreateProcessAsUser()+用户模式助手

  1. 助手调用GetLastInputInfo()
  2. 但在这种情况下,它不一定总是在运行
  3. 该服务查找具有WTSAPI的活动用户会话,并使用CreateProcessAsUser()运行帮助程序

为什么进入用户会话很复杂以及如何进行:https://web.archive.org/web/20211106110931/https://3735943886.com/?p=80https://stackoverflow.com/a/35297713/633969