Обрабатывать KeyDown во время перетаскивания. Или событие keydown не работает - PullRequest
1 голос
/ 19 января 2012

Мне нужно обработать событие"KeyDown", пока работает перетаскивание пользователя.

Пример использования.Когда пользователь нажимает «alt», изображение под курсором будет изменено, и пользователь может удалить дополнительные данные элемента.

Но KeyDown вообще не работает!Только кнопка Esc!

Пожалуйста, помогите.Мне действительно нужно определить событие.

Ps Я попробовал этот код:

   [DllImport("user32.dll")]
private static extern short GetKeyState(Keys key);

Но я могу определить нажатую кнопку только при движении мыши.Но мне действительно нужен ключ событие внизу , чтобы определить, что нажали alt.

1 Ответ

2 голосов
/ 19 января 2012

Вы можете попробовать использовать:

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");
            }
        }
    }

Если вам нужна дополнительная информация об этом решении, сообщите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...