Использование клавиш для изменения рамки изображения [дубликат]

Он возвращает список, подобный массиву.

Вы делаете этот массив как пример

var el = getElementsByClassName("elem");
el = Array.prototype.slice.call(el); //this line
el[0].appendChild(otherElem);  
48
задан BoltClock 25 May 2012 в 13:45
поделиться

3 ответа

У вашей формы есть свойство KeyPreview, установленное в true?

Form.KeyPreview Свойство

Получает или задает значение, указывающее, будет ли форма получать ключевые события перед событием передается в элемент управления с фокусом.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx

119
ответ дан jeffgabhart 21 August 2018 в 07:47
поделиться
  • 1
    Нет, поэтому я переключил его, и это решило! Спасибо за ваш ответ и ссылку на документацию. – BoltClock♦ 3 July 2010 в 21:28
  • 2
    Это взлома, доступный для того, чтобы держать программистов VB6 счастливыми. Он имеет проблемы с выполнением заказа, вместо этого переопределяет ProcessCmdKey (). – Hans Passant 3 July 2010 в 22:31
  • 3
    @HansPassant, я не могу найти ничего, объясняющего проблемы порядка выполнения. KeyDown + KeyPreview не будет видеть все ключи, что является достаточной проблемой, но каковы проблемы порядка выполнения? – kdbanman 9 December 2015 в 00:11
  • 4
    Существует множество переопределений для обнаружения быстрых нажатий клавиш. Выполненный по порядку, KeyPreview + KeyDown мертв последним. – Hans Passant 9 December 2015 в 00:43

Наиболее распространенный совет по этой проблеме в StackOverflow и MSDN 1 , 2 (включая принятый ответ здесь) является быстрым и легким:

События

KeyDown запускаются на Form, пока его свойство KeyPreview установлено на true

. Это подходит для большинства целей, но это рискованно по двум причинам:

  1. KeyDown обработчики не видят всех клавиш . В частности, «вы не можете видеть типы нажатий клавиш, которые используются для навигации. Подобно клавишам курсора, Tab, Escape и Enter для диалога».
  2. Существует несколько способов перехвата ключевых событий , и все они происходят последовательно. KeyDown обрабатывается последним . Следовательно, KeyPreview не является большим количеством предварительного просмотра, и это событие может быть отключено на несколько остановок на этом пути.

(кредит для @HansPassant для этих точек.)

Вместо этого переопределите ProcessCmdKey в вашем Form:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if (keyData == Keys.Up)
    {
        // Handle key at form level.
        // Do not send event to focused control by returning true.
        return true;
    }
  return base.ProcessCmdKey(ref msg, keyData);
}

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

Обратите внимание, что вы все еще имеете контроль над тем, контролировали ли сфокусированные элементы управления событие KeyDown. Просто верните true, чтобы заблокировать последующее событие KeyDown, вместо установки KeyPressEventArgs.Handled на true, как это было бы в обработчике события KeyDown. Здесь - статья с более подробной информацией.

26
ответ дан Community 21 August 2018 в 07:47
поделиться
  • 1
    Это правильный ответ, особенно если вы обнаружите, что PreviewKeyDown не запускает вообще с KeyPreview, установленным в true. – Tim 28 January 2016 в 00:16
  • 2
    Действительно, очень полезно. Я бы поднял его дважды, если бы мог! спасибо – Mong Zhu 9 February 2017 в 16:41

Попробуйте установить для свойства KeyPreview в вашей форме значение true. Это работало для меня для регистрации нажатия клавиш.

19
ответ дан Seb Charrot 21 August 2018 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: