使用带大写锁定的 sendkeys 的不可预测的结果
Unpredictable results using sendkeys with capslock
我想模拟用户输入以防止屏幕锁定。
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);
}
我的问题是大写锁定有时会保持打开或关闭状态,有时会闪烁。
这不是很可预测。
我认为您可能在多个线程之间存在竞争条件,从而导致结果不一致。
防止计算机休眠的正确方法是使用SetThreadExecutionState函数。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa373208%28v=vs.85%29.aspx
你可以 p/Invoke 这个很容易,我过去在 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
}
我想模拟用户输入以防止屏幕锁定。
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);
}
我的问题是大写锁定有时会保持打开或关闭状态,有时会闪烁。 这不是很可预测。
我认为您可能在多个线程之间存在竞争条件,从而导致结果不一致。
防止计算机休眠的正确方法是使用SetThreadExecutionState函数。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa373208%28v=vs.85%29.aspx
你可以 p/Invoke 这个很容易,我过去在 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
}