Вы можете попробовать использовать:
bool isKeyPressed = Keyboard.IsKeyDown(Key.LeftAlt);
И поместите его в соответствующее событие, которое соответствует вашим потребностям, например, DragEnter, DragOver или используйте таймер и проверяйте состояние клавиши с постоянной скоростью.
Если вы используете таймер, запускающий событие достаточно часто (например, каждые 100 мс), он должен реагировать мгновенно. Вы можете использовать дополнительный флаг для обработки каждого нажатия и отпускания клавиши один раз (и НЕ каждый раз, когда таймер запускает свое событие).
UPDATE
Я реализовал это только для того, чтобы проверить его, и, похоже, он работает правильно, даже если пользователь перетаскивает что-то (я проверил это для перетаскивания текста).
Это простой случай, когда вы хотите обнаружить нажатие клавиши и нажатие клавиши события для одной конкретной клавиши (слева ALT), но его можно довольно легко изменить для мониторинга столько ключей, сколько вы хотите.
Во-первых, добавьте два поля в класс окна, в котором вы хотите обнаружить клавиши и клавиши и , клавишу вверх * in:
DispatcherTimer timer = new DispatcherTimer();
bool keyPressed = false;
DispatcherTimer
используется здесь, поэтому событие, вызванное таймером, выполняется в контексте потока пользовательского интерфейса окна.
Затем добавьте метод Window_Loaded
к событию Loaded
окна.
Затем вы можете реализовать только что добавленный метод как обработчик событий Loaded
и инициализировать там таймер:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
timer.Tick += new EventHandler(timer_Tick);
//timer will raise an event checking key state each 100ms
timer.Interval = TimeSpan.FromMilliseconds(100);
timer.Start();
}
Наконец, вы должны добавить реализацию timer_Tick
метода, который проверяет состояние ключа, который вы хотите отслеживать:
void timer_Tick(object sender, EventArgs e)
{
if (Keyboard.IsKeyDown(Key.LeftAlt))
{
//checking flag to handle each key press only once
if (!keyPressed)
{
keyPressed = true;
//TODO: write your key down handling code here
//i.e.: sampleRichTextBox.AppendText("Left Alt is down;\t");
}
}
else
{
//checking flag to handle each key release only once
if (keyPressed)
{
keyPressed = false;
//TODO: write your key up handling code here
//i.e.: sampleRichTextBox.AppendText("Left Alt is up;\t");
}
}
}
Если вам нужна дополнительная информация об этом решении, сообщите мне.