消息框中的帮助按钮在控制台应用程序中不起作用

时间:2018-11-06 08:31:08

标签: c# console messagebox

下面的代码是一个控制台应用程序。通过添加System.Windows.Forms参考,我可以使用MessageBox。帮助按钮显示在消息框中,但是单击它不会打开帮助窗口。它不会引发任何异常。有可能做到吗?

下面的代码段

MessageBox.Show("ABCD", "Caption is",
                  MessageBoxButtons.OK,
                  MessageBoxIcon.Information,
                  MessageBoxDefaultButton.Button2,
                  0, @"S:\Product\Documentation\Help.chm",
                  HelpNavigator.TopicId, "34049");

2 个答案:

答案 0 :(得分:1)

正如在控制台应用程序中绑定所指出的那样,您将使用writeline以某种方式帮助用户。

我已经制作了一个模拟WinForm应用程序,并且“帮助”按钮确实按预期工作。 尝试过控制台应用程序,并且“帮助”按钮不起作用。

如果您可以捕获事件帮助按钮的单击,则可以使其在控制台应用程序中运行。但这将比解决方案更棘手。

答案 1 :(得分:0)

我发现

  1. WinForms应用程序中,如果尚未显示表单,则也无法启动帮助文件。也就是说,如果将代码段放在Form的构造函数中,则会出现相同的问题。

  2. Console应用程序中,如果已创建一个表单并显示该表单,则该代码段运行良好。

然后,我检查了MessageBox class的参考源,发现它公开了HelpInfo中使用的Control class's message loop属性。

 ///     Handles the WM_HELP message
 private void WmHelp(ref Message)     

换句话说,chm文件的启动实际上是由Control类通过处理WM_HELP消息完成的。这就是为什么这需要一个表单,并且还要求已经显示该表单的原因(因此消息循环已经在运行)。

下面的代码说明了我的发现,请注意,这是一个 Console项目

public class OpenCHMInMessageBox
{
    public void ShowCHM()
    {
        MyForm form1 = new MyForm();            
        form1.Show();

        MessageBox.Show("ABCD", "Caption is",
              MessageBoxButtons.OK,
              MessageBoxIcon.Information,
              MessageBoxDefaultButton.Button2,
              0, @"S:\Product\Documentation\Help.chm",
              HelpNavigator.TopicId, "34049");
    }
}

public class MyForm : Form
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0053) //WM_HELP 
        {
            System.Diagnostics.Debug.WriteLine("WM_HELP");
            //return;  //return if you don't want to handle the WM_HELP message, then CHM will NOT be launched
        }

        base.WndProc(ref m);
    }
}