Обрабатывать KeyDown во время перетаскивания - PullRequest
2 голосов
/ 08 декабря 2010

Мне нужно реагировать на события нажатия клавиш (клавиши O, C, G и т. Д., А не клавиши-модификаторы), пока выполняется операция перетаскивания + отбрасывания над моим управлением (т. Е. Между DragEnter и DragLeave).Однако событие KeyDown на этом этапе не вызывается.

Я пытался выбрать свой элемент управления и специально установить фокус на DragEnter, но это не работает.

РЕДАКТИРОВАТЬ:

Ответ Ганса в основном правильный, за исключением того, что мне пришлось использовать GetAsynchKeyState, чтобы получить поведение, которое я хотел.

Ответы [ 2 ]

3 голосов
/ 08 декабря 2010

Событие QueryContinueDrag возникает при перетаскивании source .Проверка состояния ключей, которые вас интересуют, потребует pinvoke, событие предназначено только для того, чтобы помочь распознать изменения состояния клавиши Escape и клавиши-модификатора.Что следует иметь в виду, что эти клавиши имеют какое-либо специальное действие, которое очень невозможно обнаружить.

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

Возвращает значение <0, когда клавиша нажата.Я не могу сказать, что он гарантированно работает правильно, но он выглядел хорошо, когда я попробовал. </p>

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

Вы также можете попробовать: Keyboard.IsKeyDown(); метод, чтобы проверить, нажата ли конкретная клавиша, например:

bool isKeyPressed = Keyboard.IsKeyDown(Key.LeftAlt);

Это похоже на предыдущий ответ, но это собственный метод .NET, поэтомуне требуется импортировать какие-либо функции.

Похожий вопрос был задан здесь: Обрабатывать KeyDown во время перетаскивания.Или событие keydown не рабочее , но было предложение сделать его похожим на событие.

ОБНОВЛЕНИЕ

Первое решение работает только в WPF,Если вы хотите проверить состояния клавиш-модификаторов , существует метод, использующий свойство Form.ModifierKeys, которое должно корректно работать в WinForms.В примере показано, как проверить, нажаты ли клавиши alt (left alt) и ctrl :

if (Form.ModifierKeys == (Keys.Alt | Keys.Control))
{
    //TODO: insert your code here
}
...