我的申请有几种形式。我想要做的是能够使用一对预定义的键(比如 Keys.A + Keys.B)在它们之间(并且只在它们之间)切换,就像ALT + TAB对 Windows 所做的那样(窗口显示在前台)。我尝试获取表单列表,然后以编程方式调用 Alt + Tab,但是,正如预期的那样,这允许在所有打开的窗口之间切换,而不仅仅是属于应用程序的窗口。
谢谢你的帮助!
您可以实现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枚举。
如果您打开了多个窗口(窗体)并且它们具有正常的标题或属于 MDI,那么Ctrl+F6是在它们之间切换的标准快捷方式。
否则,制作热键以在表单之间切换是非常简单的任务:
KeyPreview = true
和KeyDown
| KeyUp
事件;Application.OpenForms
);