gpt4 book ai didi

c# - GetlastInput 和 Tickcount

转载 作者:行者123 更新时间:2023-11-30 21:06:41 25 4
gpt4 key购买 nike

我有以下控制台应用程序代码片段,如果空闲时间超过 5 秒,我想锁定我的计算机。

问题:5 秒后什么也没有发生

    public static uint GetIdleTime()
{
LASTINPUTINFO lastInPut = new LASTINPUTINFO();
lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
GetLastInputInfo(ref lastInPut);

return ((uint)Environment.TickCount - lastInPut.dwTime);
}

public static long GetTickCount()
{
return Environment.TickCount;
}

public static long GetLastInputTime()
{
LASTINPUTINFO lastInPut = new LASTINPUTINFO();
lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
if (!GetLastInputInfo(ref lastInPut))
{
throw new Exception(GetLastError().ToString());
}
return lastInPut.dwTime;
}


private static Timer timer;
private static uint idle = 0;
static void Main(string[] args)
{
timer = new Timer();
timer.Enabled = true;
timer.Interval = 1000;
timer.Start();

idle += GetIdleTime();
System.Threading.Thread.Sleep(6000);
if (idle > 5000)
{
LockWorkStation();
}
}

最佳答案

您的代码中有一两处奇怪的地方。计时器没有做太多事情,您正在累积空闲时间,并且在计算空闲时间 6 秒后测试空闲时间,而无需重新计算。

试试这个:

    public static uint GetIdleTime()
{
LASTINPUTINFO lastInPut = new LASTINPUTINFO();
lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
GetLastInputInfo(ref lastInPut);

return ((uint)Environment.TickCount - lastInPut.dwTime);
}

public static long GetTickCount()
{
return Environment.TickCount;
}

[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));

[MarshalAs(UnmanagedType.U4)]
public UInt32 cbSize;
[MarshalAs(UnmanagedType.U4)]
public UInt32 dwTime;
}

[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
[DllImport("user32.dll", SetLastError = true)]
static extern bool LockWorkStation();

static int GetLastInputTime()
{
int idleTime = 0;
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)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);
}


private static uint idle = 0;
static void Main(string[] args)
{
while (!Console.KeyAvailable)
{
System.Threading.Thread.Sleep(500);
idle = GetIdleTime();
Console.WriteLine(idle);
if (idle > 5000)
{
LockWorkStation();
}
}
}

关于c# - GetlastInput 和 Tickcount,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10977149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com