Привет,
Я хочу написать код, который выполняется в обработчике событий внутри приложения WPF Windows, который может обнаружить нажатие клавиши, в частности нажатие клавиши «Escape», в цикле обработки. Это позволит пользователю избежать обработки. Я понимаю, что это может быть достигнуто с помощью какого-то многопоточного подхода, но проблема кажется настолько простой, что я подумал, можно ли это сделать следующим образом:
// Попытка 1: проверьте, обнаруживает ли статический метод KeyK IsKeyDown клавиатур обнаружение нажатий клавиш во время выполнения.
// Обратите внимание, что это не удалось. Состояния клавиатуры не обновляются во время обработки.
bool iskeypressed = false;
while (!iskeypressed)
{
System.Threading.Thread.Sleep(1000);
if (Keyboard.IsKeyDown(Key.Enter))
iskeypressed = true;
}
Итак, попытка № 2. Я видел несколько статей и примеров, используя метод Pinvoke «GetKeyboardState». Я не уверен, что использовал метод правильно, но вот моя попытка. Немного неуклюже ссылаться на перечисление Windows.Forms в приложении WPF, но кажется, что оно может работать.
// Попытка 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;
}
Но, к сожалению, я не вижу каких-либо изменений в состояниях клавиатуры, поскольку это выполняется. Я также немного поигрался с обращениями к Диспетчеру, чтобы узнать, смогу ли я обновить информацию клавиатуры во время обработки, но я не добился успеха ни с какой техникой.
У меня нет идей. Может кто-то что-то предложить? Спасибо заранее за помощь.