【发布时间】:2014-08-26 14:56:28
【问题描述】:
你好,
我想编写在 WPF Windows 应用程序内的事件处理程序中执行的代码,该代码可以检测处理循环中的按键,特别是“转义”字符按键。这将允许用户逃避处理。我意识到这可以通过某种多线程方法来完成,但问题似乎很简单,我想知道它是否可以如下完成:
// 尝试 1:查看 Keyboard 静态 IsKeyDown 方法是否在执行时检测到按键。
// 请注意,这并不成功。键盘状态在处理过程中似乎没有更新。
bool iskeypressed = false;
while (!iskeypressed)
{
System.Threading.Thread.Sleep(1000);
if (Keyboard.IsKeyDown(Key.Enter))
iskeypressed = true;
}
所以,继续尝试#2。我看到了一些使用 Pinvoke“GetKeyboardState”方法的文章和示例。我不确定我是否正确使用了该方法,但这是我的尝试。在 WPF 应用程序中引用 Windows.Forms 枚举有点笨拙,但它似乎可以工作。
// 尝试 2:使用 Pinvoke GetKeyboardState 方法。
// 到目前为止,我也没有成功,但我不确定我的用法是否正确。
bool iskeypressed = false;
while (!iskeypressed)
{
System.Threading.Thread.Sleep(1000);
if (isEscapePressed())
iskeypressed = true;
}
}
[DllImport("user32.dll")] public static extern int GetKeyboardState(byte[] lpKeyState);
private bool isEscapePressed()
{
byte[] keyboardState = new byte[255];
int keystate = GetKeyboardState(keyboardState);
if (keyboardState[(int)System.Windows.Forms.Keys.Escape] == 128)
return true;
else
return false;
}
但不幸的是,在执行此操作时,我没有看到键盘状态有任何变化。我还尝试了调用 Dispatcher 以查看是否可以在处理过程中刷新键盘信息,但我没有成功使用任何技术。
我没有想法。有人可以提出一些建议吗?预先感谢您的协助。
- 大卫
【问题讨论】: