GKRISH04 Ответов: 3

Как работает событие нажатия клавиши?


Привет, я работаю над формой windows c#. Если я заполнил все текстовые поля, то нажму клавишу F4, чтобы сохранить данные в БД . Теперь я хочу знать кодировку события нажатия клавиши. Пожалуйста, предложите мне несколько идей.



Спасибо.

Что я уже пробовал:

Я понятия не имел о ключевом пресс-мероприятии.

3 Ответов

Рейтинг:
23

OriginalGriff

Нажатие клавиши срабатывает только для" печатаемых " символов плюс backspace.

Richard MacCutchan

Очевидно, мне нужно изучить эти две связи.

OriginalGriff

: смех: это уже застало меня врасплох!

GKRISH04

А потом ? Нет никакого способа сделать ярлык в моей форме ?

Рейтинг:
16

OriginalGriff

Проблема с событием нажатия клавиши заключается в том, что оно происходит для каждой клавиши и направлено на элемент управления, который имеет "фокус ввода" - это означает, что независимо от того, какое текстовое поле в данный момент принимает ввод, это текстовое поле, для которого запускается событие нажатия клавиши, - обычно вы не получаете его в форме, что на самом деле вам нужно. И нажатие клавиши вообще не срабатывает для F4, хотя KeyDown и KeyUp-это так, нажатие клавиши в любом случае срабатывает только для печатных символов.

Это непригодный способ сделать это - обычное действие в Windows заключается в том, что ENTER принимает данные формы, и это легко сделать, все равно все это встроено в WinForms. F4 необычен и, вероятно, сбивает с толку пользователей, поэтому я настоятельно рекомендую вам не идти с ним.
Вы можете это сделать - но вам придется переопределить функцию ProcessCmdKey для формы, и вы, вероятно, заставите своих пользователей ненавидеть программное обеспечение!


GKRISH04

Я использовал его для быстрого доступа. тогда как я могу сделать, чтобы отправить данные при нажатии cntl + S ?

OriginalGriff

Добавить еще одно сочетание клавиш, или переопределение метода processcmdkey и запереть его там.

GKRISH04

как ? Пожалуйста xplain его

OriginalGriff

https://msdn.microsoft.com/en-us/library/system.windows.forms.form.processcmdkey(v=против 110). aspx

GKRISH04

Спасибо брат :-)

OriginalGriff

Пожалуйста!

BillWoodruff

+5
Привет, Грифф, мне любопытно, что вы думаете о технике" Эль-чип", которую я здесь разместил. к вашему сведению: я думаю, что это более уместно использовать, если вы уже используете меню.

OriginalGriff

Это работает, но, как вы говорите, это немного халтурно, если вы не используете меню.
Я нахожу это достаточно простым, чтобы использовать ProcessCmdKey и отфильтровать те, которые меня интересуют.

Рейтинг:
11

BillWoodruff

Есть еще один способ сделать это в WinForms без необходимости переопределять 'ProcessCommandKey, устанавливать Form' KeyPreView в 'true и т. д.; Это немного "хакерски", но я надеюсь, что это завершит обсуждение здесь.

1. Поместите MenuStrip в форму: если вы не хотите использовать MenuStrip для отображения некоторых пунктов меню, установите для его свойства Visible значение false.

2. Добавьте ToolStripMenuItem в MenuStrip обычным способом. Установите его ShortCutKeys на комбинацию клавиш, которую вы хотите вызвать событие. Установите для его свойства Visible значение false.

3. Добавьте обработчик событий Click в ToolStripMenuItem и напишите код, который вы хотите выполнить, когда произойдет щелчок.

Пример:

Я добавляю MenuStrip, " menuStrip11. Я добавляю ToolStripMenuItem, ' AltF4ShortCut с комбинацией клавиш, установленной на 'Alt и' F4. В представлении конструктора формы вы увидите:

// AltF4ShortCut
// 
this.AltF4ShortCut.Name = "AltF4ShortCut";
this.AltF4ShortCut.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4)));
this.AltF4ShortCut.Size = new System.Drawing.Size(52, 24);
this.AltF4ShortCut.Text = "Save";
this.AltF4ShortCut.Visible = false;
this.AltF4ShortCut.Click += new System.EventHandler(this.AltF4ShortCut_Click);
Теперь обработчик событий Click будет срабатывать независимо от того, какой элемент управления имеет фокус в форме времени выполнения; я мог бы установить текущий фокус на текстовое поле на панели в UserControl, и он все равно будет срабатывать.

Вот как может выглядеть обработчик событий Click:
private void AltF4ShortCut_Click(object sender, EventArgs e)
{
    if (MessageBox.Show(
            "Save now ?",
            "Save Data",
            MessageBoxButtons.OKCancel,
            MessageBoxIcon.Question,
            MessageBoxDefaultButton.Button1,
            MessageBoxOptions.DefaultDesktopOnly
        )
        == DialogResult.OK)
    {
        //  code to save goes here
    }
}
Я думаю, что можно с уверенностью предположить, что приложение WinForm с пунктом меню с определенными комбинациями клавиш быстрого доступа устанавливает свой собственный обработчик нижних рычагов для событий клавиатуры, возможно, даже используя то, что ProcessCmdKey over-ride использует под капотом (может быть, WndProc ?).