作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下控制台应用程序代码片段,如果空闲时间超过 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/
我有以下控制台应用程序代码片段,如果空闲时间超过 5 秒,我想锁定我的计算机。 问题:5 秒后什么也没有发生 public static uint GetIdleTime() {
我是一名优秀的程序员,十分优秀!