2014-01-13 6 views
0

Мое приложение имеет несколько форм. Я хочу сделать это, чтобы иметь возможность переключаться между ними (и только между ними), используя пару предопределенных ключей (например, Keys.A + Keys.B), как и ALT + TAB делает для Windows (окна отображаются на переднем плане). Я попытался получить список форм, а затем программно вызывать Alt + Tab, но, как и ожидалось, это позволяет переключаться между всеми открытыми окнами, а не только принадлежащими к приложению.Как отображать только мои формы приложения при нажатии Key1 + Key2, так же, как Alt + Tab в Windows?

Спасибо за помощь!

+0

См. Http://stackoverflow.com/questions/2146970/handle-the-keydown-event-when-altkey-is-press –

+0

[Вот аналогичная тема] [1]. Удачи! ;) [1]: http://stackoverflow.com/questions/1346689/how-do-i-trap-windows-key-alttab-ctrlaltdelete-in-c –

+0

@UriY это показывает только то, как чтобы поймать событие, и не то, что я искал –

ответ

1

Вы можете реализовать IMessageFilter и добавить его в свой Application, а затем глобально обработать сообщения своего приложения.

Вот как вы это делаете.

public class MessageFilter : IMessageFilter 
{ 
    public bool PreFilterMessage(ref Message m) 
    { 
     switch ((WindowsMessage)m.Msg) 
     { 
      case WindowsMessage.WM_KEYDOWN: 
      case WindowsMessage.WM_SYSKEYDOWN: 
       { 
        if (((int)m.WParam | ((int)Control.ModifierKeys)) != 0) 
        { 
         Keys keyData = (Keys)(int)m.WParam; 

         var activeForm = Form.ActiveForm; 
         var forms = Application.OpenForms.Cast<Form>().Where(x => x.Visible).ToArray(); 
         int active = Array.IndexOf(forms, activeForm); 
         if (keyData == Keys.A) 
         { 
          int next = (active + 1)%forms.Length; 
          forms[next].Activate();//Activate next 
         } 
         else if (keyData == Keys.B) 
         { 
          int prev = (active - 1) % forms.Length; 
          forms[prev].Activate();//Activate previous 
         } 

        break; 
       } 
     } 

     return false; 
    } 
} 

class MainForm : Form 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     Application.AddMessageFilter(new MessageFilter()); 
    } 
} 

Вы можете найти WindowsMessage перечисление здесь.

+0

Это только переход между формами приложений, что хорошо. Но поведение коммутатора должно быть идентичным поведению в Alt + tab в Windows (все окна приложений должны быть видимыми на переднем плане, и пользователи должны иметь возможность выбрать тот, который он хочет) –

+0

@mirelvlad Ну, для этого требуется дополнительный код, вы можете создать формы с количеством ящиков с изображениями, в которых отображается эскиз отображаемых форм. Затем покажите это пользователю, позвольте ему выбрать то, что он хочет. –

0

Если у вас есть несколько окон (форма) открыто, и они имеют нормальный заголовок или принадлежат к MDI, то Ctrl + F6 стандартный ярлык для переключения между ними.

В противном случае, сделать горячую клавишу для переключения между формами является довольно тривиальной задачей:

  • все формы должны иметь KeyPreview = true и KeyDown | KeyUp событие;
  • все экземпляры форм должны быть доступны (одна возможность - Application.OpenForms);
  • , когда нажата горячая клавиша, найдите next/previous окно и сделать его активным.
+0

Мне действительно нужно поведение переключателя.Он должен быть идентичным таковому для alt + tab в Windows (все окна приложений должны быть видимыми на переднем плане, и пользователи должны иметь возможность выбрать тот, который он хочет) –

+0

О, человек, вы просите много. = D – Sinatr

+0

@Sinatr Вы, вероятно, пропустили мой ответ, я опубликовал рабочий пример того, как это сделать. но то, что ОП просит много ответить в SO: p –

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

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