线程在检测到F4键时延迟进程

时间:2014-08-18 09:42:45

标签: c#

请参阅以下代码

static class Program
{

    [Flags]
    private enum KeyStates
    {
        None = 0,
        Down = 1,
        Toggled = 2
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    private static extern short GetKeyState(int keyCode);

    private static KeyStates GetKeyState(Keys key)
    {
        KeyStates state = KeyStates.None;

        short retVal = GetKeyState((int)key);

        //If the high-order bit is 1, the key is down
        //otherwise, it is up.
        if ((retVal & 0x8000) == 0x8000)
            state |= KeyStates.Down;

        //If the low-order bit is 1, the key is toggled.
        if ((retVal & 1) == 1)
            state |= KeyStates.Toggled;

        return state;
    }

    public static bool IsKeyDown(Keys key)
    {
        return KeyStates.Down == (GetKeyState(key) & KeyStates.Down);
    }

    public static bool IsKeyToggled(Keys key)
    {
        return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled);
    }


    private static void DoSomething(object state)
    {
          if (IsKeyDown(Keys.F4)) 
          {
              System.Threading.Thread.Sleep(30000);
          }
    }

    [STAThread]

    static void Main()
    {

        Console.WriteLine("Application Started");
        System.Threading.Timer myTimer = new System.Threading.Timer(new TimerCallback(DoSomething), null, 0, 1000);
        // execute some long codes here
    }
}

每当系统检测到" F4" keypressed事件,它将延迟30秒..使用我当前的代码,即使用户按下键F4,似乎进程永远不会延迟...

感谢。

1 个答案:

答案 0 :(得分:1)

GetKeyState()只能在GUI应用程序中正常运行。它提供密钥的同步状态,在检测到按键时记录并添加到消息队列中。重要的是要确保能够正确检测修改键的状态,例如,它们可能在处理击键时发生了变化。

这是一个控制台模式应用程序,您必须改为使用GetAsyncKeyState()。