Как получить результат диалога из WebBrowser.ShowPageSetupDialog

Я использую элемент управления WebBrowser в своем приложении Visual C# (.net 2.0). Теперь я хотел бы добавить кнопку печати, которая показывает диалоговое окно настройки страницы, а затем напрямую печатает, когда пользователь нажимает кнопку OK, или отменяет печать, когда пользователь нажимает кнопку отмены. Однако WebBrowser.ShowPageSetupDialog не возвращает DialogResult, а просто недействителен. Есть ли что-то, что я пропустил, или какой-либо другой способ узнать действия пользователей?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 210
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Диалоговое окно настройки страницы вне элемента управления WebBrowser устанавливает записи реестра. Раньше я устанавливал эти значения для пользователя в коде и давал им только возможность печати.

У меня была та же проблема, я смог найти хитрый обходной путь, наблюдая, как программа IE Page Setup сохраняет значения полей в реестре @ "Software \ Microsoft \ Internet Explorer \ PageSetup".

Когда вы нажимаете кнопку OK в IE Page Setup, значения полей, записанные в настройке, сохраняются в виде строки (REG_SZ) длиной 8, а оставшееся пространство заполняется нулями.

i.e.

0.75 is stored as 0.750000

1.0 is stored as 1.000000

2 is stored as 2.000000

Когда вы используете WebBrowser.Print (), он преобразует значения полей в числа с плавающей запятой, поэтому наличие 0,75 или 0,750000 в качестве значений полей в реестре дает тот же результат.

Однако, если вы сравните их как строки, 0,75 и 0,750000 будут считаться разными.

А вот и хитрость:

  1. Перед вызовом WebBrowser.ShowPageSetupDialog () удалите завершающие нули в значениях полей реестра.

i.e.

0.750000 -> 0.75

0.500000 -> 0.5

1.000000 -> 1

  1. Сохраните одно из значений маржи внутри строковой переменной

  2. Вызов WebBrowser.ShowPageSetupDialog ()

  3. Если пользователь нажмет OK, значения полей в реестре будут дополнены нулями. В противном случае они останутся обрезанными, как указано в пункте 1.

  4. Сравните значения полей в реестре со значениями, хранящимися в переменной, если они совпадают, то пользователь нажал «Отмена», в противном случае пользователь нажал «ОК».

Пример :

private void ie_DocumentCompleted(object _sender, WebBrowserDocumentCompletedEventArgs e)
{
    System.Windows.Forms.WebBrowser ie = (System.Windows.Forms.WebBrowser)_sender;

    string strKey = "Software\\Microsoft\\Internet Explorer\\PageSetup";
    bool bolWritable = true;
    RegistryKey ok = Registry.CurrentUser.OpenSubKey(strKey, bolWritable);

    ok.SetValue("margin_left", 0.75, RegistryValueKind.String);

    string reg_validation = (string) ok.GetValue("margin_left");

    ie.ShowPageSetupDialog();

    if (reg_validation.Equals((string)ok.GetValue("margin_left")))
    {
        MessageBox.Show("Cancel");
    }
    else
    {
        MessageBox.Show("OK");
        ie.Print();
    }
    ok.Close()
}

Другие вопросы по теме