C # захватить основные события клавиатуры формы - PullRequest
6 голосов
/ 14 июля 2011

Как перехватить события клавиатуры главной формы WinForm, где находятся другие элементы управления. Поэтому я хочу поймать одно событие Ctrl + S и не имеет значения, где находится фокус. Но без Pinvoke (крючки и прочее ...) Только .NET управляет внутренним питанием.

Ответы [ 4 ]

10 голосов
/ 14 июля 2011

Попробуйте этот код.С помощью интерфейса IMessageFilter вы можете отфильтровать любой ключ ctrl +.

public partial class Form1 : 
    Form,
    IMessageFilter
{
    public Form1()
    {
        InitializeComponent();

        Application.AddMessageFilter(this);
        this.FormClosed += new FormClosedEventHandler(this.Form1_FormClosed);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.RemoveMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m)
    {
        //here you can specify  which key you need to filter

        if (m.Msg == 0x0100 && (Keys)m.WParam.ToInt32() == Keys.S &&
            ModifierKeys == Keys.Control) 
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

Я проверял это и работал на меня.

10 голосов
/ 14 июля 2011

Класс формы (System.Windows.Forms) имеет OnKeyDown , OnKeyPress и OnKeyUp методы событий, которые можно использовать обнаружить Ctrl + S

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

EDIT

обязательно включите Form.KeyPreview = true;, чтобы форма фиксировала события независимо от фокуса.

1 голос
/ 14 июля 2011

Обработка KeyDown в форме и всех ее элементах управления.

private void OnFormLoad(object sender, EventArgs e)
{
    this.KeyDown += OnKeyDown;
    foreach (Control control in this.Controls)
    {
        control.KeyDown += OnKeyDown;
    }
}

private void OnKeyDown(object sender, KeyEventArgs e)
{
    if (e.Control)
    {
        if (e.KeyValue == (int)Keys.S)
        {
            Console.WriteLine("ctrl + s");
        }
    }
}
0 голосов
/ 14 июля 2011

Вы можете добавить MenuStrip, а затем создать элемент полосы меню с именем save и быстро назначить ему комбинацию клавиш Ctrl + S. Добавьте для этого обработчик события.Это сработает, даже если фокус находится на другом элементе управления в форме.Если вам не нравится видеть MenuStrip;Вы также можете установить visible = false.Должен признать, это безобразно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...