C#MessageBox链接通过F1快捷方式多次打开

时间:2014-12-03 14:00:01

标签: c# keyboard-shortcuts messagebox

我的C#应用​​程序中有一个“帮助”菜单,其中包含“过滤”项。此项显示默认的MessageBox及其说明,按钮为OK,帮助在MSDN中打开链接。

string link = "http:...";
MessageBox.Show("explanation...", "Filtering", MessageBoxButtons.OK,
    MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, 0, link);

通过项目打开信息并通过“帮助”按钮打开链接可以正常工作。

问题:
我添加了一个“过滤”快捷键(F1)。现在,当我在应用程序中按F1时,它不仅会打开消息框和链接,而是打开链接2或3次。
行为是这样的:

  • 点击该项目仍然正常。
  • 首次打开应用程序时按F1键 - 链接会自动打开3次(同一页面的3个选项卡)。
  • 下次按F1(关闭消息框后) - 链接会自动打开2次。

问题在于使用F1,因为它也是框中“帮助”按钮的关键,但它仍然无法解释为什么关键事件也会在刚打开的框中发生,以及为什么链接打开2或3倍。我检查了什么:

  • 消息框打开一次。
  • 创建并打开消息框的代码运行一次 - 当我按下F1。
  • 将快捷键更改为F10或其他可以防止出现此问题,但我想将F1用作标准帮助快捷方式。

有人能想出解决这个问题的方法吗?即使链接仅打开了一次,我也没有问题。

1 个答案:

答案 0 :(得分:1)

试试这个:

private bool isClicked = false, secondTime = false;

private void FilteringToolStripMenuItem_Click(object sender, EventArgs e)
{    
    isClicked = true;
    string link = "http:...";
    MessageBox.Show("explanation...", "Filtering", MessageBoxButtons.OK,
    MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, 0, link);
    isClicked = false; 
}

private void ShowMsgBox()
{
    secondTime = true;
    string link = "http:...";
    MessageBox.Show("explanation...", "Filtering", MessageBoxButtons.OK,
    MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, 0, link);
    secondTime = false;
}

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x53) //WM_HELP message
    {
        if (isClicked == false)
        {
            if (secondTime == false)
            {
                ShowMsgBox();
            }
        }
    }

    base.WndProc(ref m);
}

删除该行:

this.FilteringToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1;

当您按下F1键时,会调用 FilteringToolStripMenuItem_Click ,打开链接,然后生成WM_HELP消息并打开另一个链接。使用上面的代码,我们检查在打开消息框时是否生成WM_HELP消息(secondTime = false和isClicked = false),以及通过打开消息框时ToolStripMenuItem (isClicked = true)