2016-11-11 5 views
0

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

Этот, по-видимому, общий сценарий (например, переключение активных документов в Visual Studio, активные вкладки в браузерах и т. Д.) Оказался неожиданно трудным для реализации. Единственный способ, который я нашел сделать до сих пор, - использовать глобальный крючок или горячую клавишу. Проблема с этим подходом заключается в том, что они не позволяют другим приложениям использовать одну и ту же горячую клавишу, так как эта настройка применяется в системе.

Каков наилучший способ для формы владельца прослушать определенные нажатия клавиш, даже если дочерние формы находятся в фокусе?

+0

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

+0

ctrl + tab должен быть добавлен по умолчанию. –

+0

@AbdulRehmanSayed Я не использую рамки MDI, а только дочерние окна с общим владельцем. Я бы предпочел избежать MDI или по крайней мере понять, как MDI реализует это. – glopes

ответ

1

Хорошо, я нашел простой способ сделать это, используя фильтры сообщений. Оказывается, вы можете регистрировать глобальные фильтры сообщений с помощью Application, используя интерфейс IMessageFilter. Например:

class HotKeyMessageFilter : IMessageFilter 
{ 
    const int WM_KEYDOWN = 0x100; 

    public bool PreFilterMessage(ref Message m) 
    { 
     if (m.Msg == WM_KEYDOWN) 
     { 
      var keyCode = (Keys)m.WParam; 
      if (keyCode == Keys.Tab && Form.ModifierKeys.HasFlag(Keys.Control)) 
      { 
       if (Form.ModifierKeys.HasFlag(Keys.Shift)) CycleActiveForm(-1); 
       else CycleActiveForm(1); 
      } 
     } 

     return false; 
    } 
} 

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

Вы можете зарегистрировать фильтры с применением в любой момент со следующим:

Application.AddMessageFilter(filter); 

и удалить его со следующим:

Application.RemoveMessageFilter(filter); 
0

При использовании формы MDI в WinForms, то Ctrl + Tab ярлык будет автоматически регистрироваться для изменения окна. Если вы пытаетесь уловить другие комбинации клавиш, установите KeyPreview в true в вашей форме MDI и обработайте нажатие клавиши там.

+0

Я не использовал рамки MDI напрямую. Как они реализуют эти ярлыки? Это действительно просто особенность MDI? Или они подключаются к KeyPreview, когда вы устанавливаете MdiParent? – glopes

 Смежные вопросы

  • Нет связанных вопросов^_^