Кнопка помощи в окне сообщения не работает в консольном приложении - PullRequest
0 голосов
/ 06 ноября 2018

Код ниже представляет собой консольное приложение. Добавив ссылку 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 голосов
/ 07 ноября 2018

Я считаю, что

  1. В приложении WinForms файл справки также нельзя запустить, если форма еще не отображена. То есть, если фрагмент кода помещается в конструктор формы, он сталкивается с той же проблемой.

  2. В приложении 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);
    }
}
0 голосов
/ 06 ноября 2018

Как указано в bommelding в консольном приложении, вы будете использовать writeline, чтобы как-то помочь пользователю.

Я сделал макет приложения WinForm, и кнопка справки работает, как и ожидалось. Пробовал с консольным приложением и кнопка справки не работает.

Вероятно, вы могли бы заставить его работать в консольном приложении, если бы могли зафиксировать нажатие кнопки справки по событию. Но это было бы более хакерским, чем решение.

...