我想模拟用户输入以防止屏幕锁定。
public Form1()
{
aTimer = new System.Threading.Timer(OnTimedEvent, null, 5000, Timeout.Infinite);
}
private void OnTimedEvent(Object source)
{
Stopwatch watch = new Stopwatch();
watch.Start();
if (IdleTimeFinder.GetIdleTime() > 2000)
{
SendKeys.SendWait({CAPSLOCK});
}
aTimer.Change(Math.Max(0, 5000 - watch.ElapsedMilliseconds), Timeout.Infinite);
}
我的问题是,有时封锁会在其他时间保持开启或关闭状态。 这不是很可预测的。
答案 0 :(得分:3)
我认为您可能在多个线程之间存在竞争条件,从而导致结果不一致。
防止计算机进入休眠状态的正确方法是使用SetThreadExecutionState函数。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa373208%28v=vs.85%29.aspx
你可以很容易地调用这个,我以前在C#中使用过它。
要从C#调用它,您将需要使用以下声明:
http://www.pinvoke.net/default.aspx/kernel32.setthreadexecutionstate
[DllImport("kernel32.dll", CharSet = CharSet.Auto,SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
[FlagsAttribute]
public enum EXECUTION_STATE :uint
{
ES_AWAYMODE_REQUIRED = 0x00000040,
ES_CONTINUOUS = 0x80000000,
ES_DISPLAY_REQUIRED = 0x00000002,
ES_SYSTEM_REQUIRED = 0x00000001
// Legacy flag, should not be used.
// ES_USER_PRESENT = 0x00000004
}