下面的代码是一个控制台应用程序。通过添加System.Windows.Forms
参考,我可以使用MessageBox
。帮助按钮显示在消息框中,但是单击它不会打开帮助窗口。它不会引发任何异常。有可能做到吗?
下面的代码段
MessageBox.Show("ABCD", "Caption is",
MessageBoxButtons.OK,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button2,
0, @"S:\Product\Documentation\Help.chm",
HelpNavigator.TopicId, "34049");
答案 0 :(得分:1)
正如在控制台应用程序中绑定所指出的那样,您将使用writeline以某种方式帮助用户。
我已经制作了一个模拟WinForm应用程序,并且“帮助”按钮确实按预期工作。 尝试过控制台应用程序,并且“帮助”按钮不起作用。
如果您可以捕获事件帮助按钮的单击,则可以使其在控制台应用程序中运行。但这将比解决方案更棘手。
答案 1 :(得分:0)
我发现
在WinForms
应用程序中,如果尚未显示表单,则也无法启动帮助文件。也就是说,如果将代码段放在Form的构造函数中,则会出现相同的问题。
在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);
}
}