使用带大写锁定的 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
}