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