Я считаю, что
В приложении WinForms
файл справки также нельзя запустить, если форма еще не отображена. То есть, если фрагмент кода помещается в конструктор формы, он сталкивается с той же проблемой.
В приложении Console
, если вы создали форму и показали ее, тогда фрагмент кода работает нормально.
Затем я проверяю источник ссылки MessageBox class
и обнаруживаю, что он предоставляет свойство HelpInfo , которое используется в Цикле сообщений класса управления .
/// Handles the WM_HELP message
private void WmHelp(ref Message)
Другими словами, запуск файла chm фактически выполняется классом Control
путем обработки сообщения WM_HELP
. Вот почему для этого требуется форма, а также требуется, чтобы форма уже отображалась (поэтому цикл сообщений уже запущен).
Ниже код иллюстрирует мои выводы, обратите внимание, что это Консольный проект .
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);
}
}