代码之家  ›  专栏  ›  技术社区  ›  Oh hi Mark

使用带有caplock的sendkey无法预测结果

  •  0
  • Oh hi Mark  · 技术社区  · 11 年前

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

    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 回复  |  直到 11 年前
        1
  •  3
  •   user700390    11 年前

    我认为多个线程之间可能存在竞争条件,从而导致结果不一致。

    防止计算机休眠的正确方法是使用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
    }