В Windows Forms вы можете в любой момент узнать текущую позицию курсора благодаря классу Cursors .
То же самое, кажется, недоступно для клавиатуры. Можно ли узнать, например, Shiftнажата ли клавиша?
Обязательно ли отслеживать каждое уведомление с клавиатуры (события KeyDown и KeyUp)?
Ответы:
Это также будет верно, если Ctrl+ Shiftне работает. Если вы хотите проверить, нажата ли только Shift,
Если вы принадлежите к наследующему классу
Control
(например, к форме), вы можете удалитьControl.
источник
GetKeyState
функцию API.Keyboard.Modifiers == ModifierKeys.Shift
(для тех, кто пришел сюда в поиске)(Control.ModifierKeys & Keys.Shift) != 0
одного можно использоватьControl.ModifierKeys.HasFlag(Keys.Shift)
В приведенном ниже коде показано, как обнаружить почти все нажатые в данный момент клавиши, а не только Shiftклавишу.
источник
GetKeyState
было бы эффективнее. Нет смысла отслеживать все ключи, когда Windows уже делает это за вас.Вы также можете посмотреть следующее, если используете WPF или ссылаетесь на System.Windows.Input
Пространство имен Keyboard также можно использовать для проверки нажатого состояния других клавиш с помощью Keyboard.IsKeyDown (Key), или, если вы подписываетесь на событие KeyDownEvent или подобное событие, аргументы события содержат список нажатых в данный момент клавиш.
источник
Большинство из этих ответов либо слишком сложны, либо, похоже, мне не подходят (например, System.Windows.Input, похоже, не существует). Затем я нашел пример кода, который отлично работает: http://www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state
На случай, если в будущем страница исчезнет, я размещаю соответствующий исходный код ниже:
источник
System.Windows.Input
существуют; для других, которые борются с этим, вам нужно добавить ссылкуPresentationCore
и дополнительную ссылкуWindowsBase
для доступа кSystem.Windows.Input.Key
перечислению. Эту информацию всегда можно найти на MSDN.static
, а неabstract
.Начиная с .NET Framework версии 3.0, можно использовать
Keyboard.IsKeyDown
метод из новогоSystem.Windows.Input
пространства имен. Например:Несмотря на то, что это часть WPF, этот метод отлично работает для приложений WinForm (при условии, что вы добавляете ссылки на PresentationCore.dll и WindowsBase.dll ). К сожалению, версии 3.0 и 3.5
Keyboard.IsKeyDown
не работали для приложений WinForm. Поэтому, если вы действительно хотите использовать его в приложении WinForm, вам необходимо настроить таргетинг на .NET Framework 4.0 или более поздней версии, чтобы он работал.источник
Keyboard.IsKeyDown
метод работает даже в проекте WinForm.Вы можете использовать P / Invoke до Win32 GetAsyncKeyState, чтобы проверить любую клавишу на клавиатуре.
Вы можете передавать значения из перечисления Keys (например, Keys.Shift) в эту функцию, поэтому для ее добавления требуется всего пара строк кода.
источник
Keyboard
не распознавался компилятором, ноGetAsyncKeystate
в user32 работал нормально. Спасибо!источник
Лучший способ, который я нашел для управления вводом с клавиатуры в форме Windows Forms, - это обработать его после нажатия клавиши и до того, как сфокусированный элемент управления получит событие. Microsoft поддерживает встроенное
Form
свойство -level с именем .KeyPreview, чтобы упростить эту задачу :Затем события формы _KeyDown, _KeyPress и / или _KeyUp могут быть маршалированы для доступа к событиям ввода до того, как элемент управления сфокусированной формой когда-либо их увидит, и вы можете применить логику обработчика, чтобы захватить событие там или позволить ему перейти к элементу управления сфокусированной формой ,
Несмотря на то, что она не такая структурно изящная, как архитектура маршрутизации событий XAML , она значительно упрощает управление функциями уровня формы в Winforms. См. Примечания MSDN по KeyPreview для предупреждений .
источник
работает для текстового поля, если приведенный выше код находится в событии keydown формы и никакой другой элемент управления не фиксирует событие keydown для нажатия клавиши.
Также можно остановить дальнейшую обработку ключей:
источник
Положение курсора x / y - это свойство, а нажатие клавиши (например, щелчок / движение мыши) - это событие. Лучшая практика - позволить интерфейсу управлять событиями. Примерно единственный раз, когда вам понадобится указанное выше, это если вы пытаетесь сделать что-то shift + mouseclick.
источник
В WinForms:
Похоже, дубликат вопроса о переполнении стека. Обнаружить нажатие клавиши Shift без использования событий в Windows Forms? ,
источник