请参阅以下代码
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,似乎进程永远不会延迟...
感谢。
答案 0 :(得分:1)
GetKeyState()只能在GUI应用程序中正常运行。它提供密钥的同步状态,在检测到按键时记录并添加到消息队列中。重要的是要确保能够正确检测修改键的状态,例如,它们可能在处理击键时发生了变化。
这是一个控制台模式应用程序,您必须改为使用GetAsyncKeyState()。