Не работает событие keydown

Не работает обработчик события KeyDown

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Не срабатывают события KeyUp и KeyDown
Всем доброго времени суток. Странно работают события keydown и KeyUp для формы. Отдельное нажатие.

Как в одном обработчике события запустить другой обработчик события
Есть список listView1, который заполняется из массива PeopleListprivate void.

Как вызвать один обработчик события в другом обработчике события?
Здравствуйте. Подскажите пожалуйста, каким образом можно вызвать информацию из одного обработчика.

точно так то?

вообще в твоем случае логичнее использовать KeyPress, на мой взгляд. попробуй, может с ним проблем не будет. если будут пиши — глянем пристальнее

znake, исправил на KeyPress:

Добавлено через 1 минуту
а вот класс Search:

Есть HWND окна. Нужно добавить на окно обработчик события KeyDown
Есть HWND окна. Нужно добавить на окно обработчик события KeyDown. Код в библиотеке загружаемой в.

Не работает обработчик события
в результате выполнения функции $(‘#r_1lvl’).append(‘

Источник

Событие KeyDown не запускается?

При кодировании небольшой игры я столкнулся с проблемой; События KeyDown и KeyUp моей формы вообще не срабатывают.

Происходит еще много всего, но я вставил только соответствующий код.

Я уже пробовал установить this.KeyPreview = true; и позвонить this.Focus(); , ничего не работает. Проблема не в методе ReactToKey() , я уже установил там точку останова, и событие никогда не запускается.

Изменить: После некоторых тестов я пришел к выводу, что проблема в моем ControllableBlock . Пока я не знаю почему, но я работаю над этим. Если я закомментирую все, что связано с player , события начнут стрелять.

Редактировать 2: Похоже, проблема в том, что я унаследовал свой ControllableBlock от Control . Если я унаследую его от Panel , он будет работать нормально. Почему это? Разве я не могу запустить событие, если я унаследовал от элемента управления? Класс ControllableBlock пока пуст, поэтому он даже не делает ничего, кроме наследования от Control .

Редактировать 3: Теперь, когда я начал награду, я хотел бы уточнить, что я не ищу решения о том, как запустить события, я ищу причину почему они не срабатывают, если я унаследовал от Control .

4 ответа

Мне удалось воспроизвести аналогичную проблему (которая, надеюсь, связана ..)

  • Элементы управления, возвращающие CanSelect==true , можно выбрать для ввода с клавиатуры.
  • Можно выбрать пустой потомок Control() , один из Panel() — нет.
  • Будет выбран первый доступный для выбора элемент управления, добавленный в форму.
  • Выбранный элемент управления по умолчанию будет красть события клавиатуры у своих родителей.
  • Для работы с некоторыми клавишами, используемыми для навигации в окне, требуются дополнительные шаги.

Проверьте здесь, чтобы получить хороший обзор того, как работает ввод с клавиатуры Windows.

Код для его воспроизведения:

Попробуйте переместить настройку обработчика в событие Form_Load, а не в конструктор. Разве в конструкторе не должно быть вызова Initialize() ? Я бы особо не рекомендовал его удалять

Если ControllableBlock наследуется от Panel, он будет иметь больше подключений к событиям и лучшую настройку взаимодействия с пользовательским интерфейсом, чем базовый объект Control.

Вам нужно сделать свой элемент управления доступным для выбора, прежде чем он сможет получить фокус.

Попробуйте добавить в свой конструктор следующее:

И убедитесь, что вы уделяете своей форме фокус после того, как она была отображена. Или переопределите OnMouseDown () и вызовите в нем this.Focus ().

Если ваши события должны быть общими для всего приложения, попробуйте установить для свойства KeyPreview значение true — это позволит вам запускать соответствующие события независимо от сфокусированного управления.

Читайте также:  Кредиты с 20 лет не работает

В противном случае вы должны прикрепить эти события непосредственно к элементу управления, который будет их обрабатывать.

Изменить:

Я удалил InitializeComponent(); из своей формы и получил поведение, идентичное вашему.

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

Источник

Форма не реагирует на события KeyPress и KeyDown

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Чем отличаются события формы KeyPress, KeyDown и KeyUp
Решил написать игру на Delphi. Подскажите, кто может: 1. Чем отличаются события формы.

Keydown, keyup и keypress
Доброго времени суток, столкнулся с проблемой. Передвигаю элементы матрицы с помощью (keydown), по.

Событие KeyDown, KeyPress, KeyUp
Когда я пишу программы, это событии когда-то срабатывают, а когда-то нет. Что влияет на это? К.

Создание процедур типа MouseDown, KeyDown, KeyPress
Как создать процедуры типа MouseDown, KeyDown, KeyPress и т.д. и т.п.?

Да. Только что проверил. Оба они одинаково работают в этом плане.

А другой код, находящийся вне одинаковых обработчиков. Это же очевидно.
Ежели не очевидно, тогда создайте пустой проект с двумя формами и повторите на нем все вот это вот.

Добавлено через 1 минуту
romasimeiz, выкладывайте архив со своим проектом.

Нажатие и сочетания клавиш робота с keyup, keydown, keypress,keycode
Подскажите, пожалуйста, как при нажати кнопки напр. W появляется какое-то сообщение(alert).Но чтоб.

Имитация события MouseDown из события KeyDown
Нужно эмитировать событие MouseDown из события KeyDown. и событие MouseUp из события KeyUp. Чтобы.

KeyDown не реагирует на кнопку Enter
Привет всем. Сделал обработчик события нажатия кнопки в RichTextBox: private void.

Источник

Клавиатура: keydown и keyup

Прежде чем перейти к клавиатуре, обратите внимание, что на современных устройствах есть и другие способы «ввести что-то». Например, распознавание речи (это особенно актуально на мобильных устройствах) или Копировать/Вставить с помощью мыши.

Поэтому, если мы хотим корректно отслеживать ввод в поле , то одних клавиатурных событий недостаточно. Существует специальное событие input , чтобы отслеживать любые изменения в поле . И оно справляется с такой задачей намного лучше. Мы рассмотрим его позже в главе События: change, input, cut, copy, paste.

События клавиатуры же должны использоваться, если мы хотим обрабатывать взаимодействие пользователя именно с клавиатурой (в том числе виртуальной). К примеру, если нам нужно реагировать на стрелочные клавиши Up и Down или горячие клавиши (включая комбинации клавиш).

Тестовый стенд

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

Сфокусируйтесь на поле и нажмите какую-нибудь клавишу.

События keydown и keyup

Событие keydown происходит при нажатии клавиши, а keyup – при отпускании.

event.code и event.key

Свойство key объекта события позволяет получить символ, а свойство code – «физический код клавиши».

К примеру, одну и ту же клавишу Z можно нажать с клавишей Shift и без неё. В результате получится два разных символа: z в нижнем регистре и Z в верхнем регистре.

Свойство event.key – это непосредственно символ, и он может различаться. Но event.code всегда будет тот же:

Клавиша event.key event.code
Z z (нижний регистр) KeyZ
Shift + Z Z (Верхний регистр) KeyZ

Если пользователь работает с разными языками, то при переключении на другой язык символ изменится с «Z» на совершенно другой. Получившееся станет новым значением event.key , тогда как event.code останется тем же: «KeyZ» .

У каждой клавиши есть код, который зависит от её расположения на клавиатуре. Подробно о клавишных кодах можно прочитать в спецификации о кодах событий UI.

  • Буквенные клавиши имеют коды по типу «Key » : «KeyA» , «KeyB» и т.д.
  • Коды числовых клавиш строятся по принципу: «Digit » : «Digit0» , «Digit1» и т.д.
  • Код специальных клавиш – это их имя: «Enter» , «Backspace» , «Tab» и т.д.

Существует несколько широко распространённых раскладок клавиатуры, и в спецификации приведены клавишные коды к каждой из них.

Можно их прочитать в разделе спецификации, посвящённом буквенно-цифровым клавишам или просто нажмите нужную клавишу на тестовом стенде выше и посмотрите.

Выглядит очевидно, но многие всё равно ошибаются.

Пожалуйста, избегайте опечаток: правильно KeyZ , а не keyZ . Условие event.code==»keyZ» работать не будет: первая буква в слове «Key» должна быть заглавная.

А что, если клавиша не буквенно-цифровая? Например, Shift или F1 , или какая-либо другая специальная клавиша? В таких случаях значение свойства event.key примерно тоже, что и у event.code :

Клавиша event.key event.code
F1 F1 F1
Backspace Backspace Backspace
Shift Shift ShiftRight или ShiftLeft

Обратите внимание, что event.code точно указывает, какая именно клавиша нажата. Так, большинство клавиатур имеют по две клавиши Shift : слева и справа. event.code уточняет, какая именно из них была нажата, в то время как event.key сообщает о «смысле» клавиши: что вообще было нажато ( Shift ).

Допустим, мы хотим обработать горячую клавишу Ctrl + Z (или Cmd + Z для Mac). Большинство текстовых редакторов к этой комбинации подключают действие «Отменить». Мы можем поставить обработчик событий на keydown и проверять, какая клавиша была нажата.

Здесь возникает дилемма: в нашем обработчике стоит проверять значение event.key или event.code ?

С одной стороны, значение event.key – это символ, он изменяется в зависимости от языка, и если у пользователя установлено в ОС несколько языков, и он переключается между ними, нажатие на одну и ту же клавишу будет давать разные символы. Так что имеет смысл проверять event.code , ведь его значение всегда одно и тоже.

Вот пример кода:

С другой стороны, с event.code тоже есть проблемы. На разных раскладках к одной и той же клавише могут быть привязаны разные символы.

Например, вот схема стандартной (US) раскладки («QWERTY») и под ней немецкой («QWERTZ») раскладки (из Википедии):

Для одной и той же клавиши в американской раскладке значение event.code равно «Z», в то время как в немецкой «Y».

Буквально, для пользователей с немецкой раскладкой event.code при нажатии на Y будет равен KeyZ .

Если мы будем проверять в нашем коде event.code == ‘KeyZ’ , то для людей с немецкой раскладкой такая проверка сработает, когда они нажимают Y .

Звучит очень странно, но это и в самом деле так. В спецификации прямо упоминается такое поведение.

Так что event.code может содержать неправильный символ при неожиданной раскладке. Одни и те же буквы на разных раскладках могут сопоставляться с разными физическими клавишами, что приводит к разным кодам. К счастью, это происходит не со всеми кодами, а с несколькими, например KeyA , KeyQ , KeyZ (как мы уже видели), и не происходит со специальными клавишами, такими как Shift . Вы можете найти полный список проблемных кодов в спецификации.

Чтобы отслеживать символы, зависящие от раскладки, event.key надёжнее.

С другой стороны, преимущество event.code заключается в том, что его значение всегда остаётся неизменным, будучи привязанным к физическому местоположению клавиши, даже если пользователь меняет язык. Так что горячие клавиши, использующие это свойство, будут работать даже в случае переключения языка.

Хотим поддерживать клавиши, меняющиеся при раскладке? Тогда event.key – верный выбор.

Или мы хотим, чтобы горячая клавиша срабатывала даже после переключения на другой язык? Тогда event.code может быть лучше.

Автоповтор

При долгом нажатии клавиши возникает автоповтор: keydown срабатывает снова и снова, и когда клавишу отпускают, то отрабатывает keyup . Так что ситуация, когда много keydown и один keyup , абсолютно нормальна.

Для событий, вызванных автоповтором, у объекта события свойство event.repeat равно true .

Действия по умолчанию

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

  • Появление символа (самое очевидное).
  • Удаление символа (клавиша Delete ).
  • Прокрутка страницы (клавиша PageDown ).
  • Открытие диалогового окна браузера «Сохранить» ( Ctrl + S )
  • …и так далее.

Предотвращение стандартного действия с помощью event.preventDefault() работает практически во всех сценариях, кроме тех, которые происходят на уровне операционной системы. Например, комбинация Alt + F4 инициирует закрытие браузера в Windows, что бы мы ни делали в JavaScript.

Для примера, ниже ожидает телефонный номер, так что ничего кроме чисел, + , () или — принято не будет:

Заметьте, что специальные клавиши, такие как Backspace , Left , Right , Ctrl + V , в этом поле для ввода не работают. Это побочный эффект чересчур жёсткого фильтра checkPhoneKey .

Добавим ему немного больше свободы:

Теперь стрелочки и удаление прекрасно работают.

…Впрочем, мы всё равно можем ввести в что угодно с помощью правого клика мыши и пункта «Вставить» контекстного меню. Так что такой фильтр не обладает 100% надёжностью. Мы можем просто оставить всё как есть, потому что в большинстве случаев это работает. Альтернатива – отслеживать событие input , оно генерируется после любых изменений в поле , и мы можем проверять новое значение и подчёркивать/изменять его, если оно не подходит.

«Дела минувших дней»

В прошлом существовало также событие keypress , а также свойства keyCode , charCode , which у объекта события.

Но количество браузерных несовместимостей при работе с ними было столь велико, что у разработчиков спецификации не было другого выхода, кроме как объявить их устаревшими и создать новые, современные события (которые и описываются в этой главе). Старый код ещё работает, так как браузеры продолжают поддерживать и keypress , и keyCode с charCode , и which , но более нет никакой необходимости в их использовании.

Итого

Нажатие клавиши всегда генерирует клавиатурное событие, будь то буквенно-цифровая клавиша или специальная типа Shift или Ctrl и т.д. Единственным исключением является клавиша Fn , которая присутствует на клавиатуре некоторых ноутбуков. События на клавиатуре для неё нет, потому что она обычно работает на уровне более низком, чем даже ОС.

  • keydown – при нажатии на клавишу (если клавиша остаётся нажатой, происходит автоповтор),
  • keyup – при отпускании клавиши.

Главные свойства для работы с клавиатурными событиями:

  • code – «код клавиши» ( «KeyA» , «ArrowLeft» и так далее), особый код, привязанный к физическому расположению клавиши на клавиатуре.
  • key – символ ( «A» , «a» и так далее), для не буквенно-цифровых групп клавиш (таких как Esc ) обычно имеет то же значение, что и code .

В прошлом события клавиатуры иногда использовались для отслеживания ввода данных пользователем в полях формы. Это ненадёжно, потому как ввод данных не обязательно может осуществляться с помощью клавиатуры. Существуют события input и change специально для обработки ввода (рассмотренные позже в главе События: change, input, cut, copy, paste). Они срабатывают в результате любого ввода, включая Копировать/Вставить мышью и распознавание речи.

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

Задачи

Отследить одновременное нажатие

Создайте функцию runOnKeys(func, code1, code2, . code_n) , которая запускает func при одновременном нажатии клавиш с кодами code1 , code2 , …, code_n .

Например, код ниже выведет alert при одновременном нажатии клавиш «Q» и «W» (в любом регистре, в любой раскладке)

Необходимо использовать два обработчика событий: document.onkeydown и document.onkeyup .

Создадим множество pressed = new Set() , в которое будем записывать клавиши, нажатые в данный момент.

В первом обработчике будем добавлять в него значения, а во втором удалять. Каждый раз, как отрабатывает keydown , будем проверять – все ли нужные клавиши нажаты, и, если да – выводить сообщение.

Источник

Оцените статью