使用带有大写锁定的sendkeys不可预知的结果

时间:2015-03-12 18:22:48

标签: c# sendkeys

我想模拟用户输入以防止屏幕锁定。

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);
 } 

我的问题是,有时封锁会在其他时间保持开启或关闭状态。 这不是很可预测的。

1 个答案:

答案 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
}