Задать вопрос
AlexXYZ
@AlexXYZ
O Keep Clear O

Как программно вызвать диалог использования программы по умолчанию для заданного протокола (http/https)?

Всем привет.
Нужно программно в C# вызвать диалог для изменения браузера по-умолчанию?

59e73a8359a1e272618012.png

Есть подозрение, что это делает функция SHChangeNotify. Вроде как она вызывается без ошибок:

59e73c2befb79254157412.png

, но никакого диалога не появляется. Вижу, что нигде не фигурирует протокол https. Не очень понимаю, куда его подставить, и верная ли функция?

Google Chrome, например, умеет это делать:

59e73f860c595398269533.png
  • Вопрос задан
  • 181 просмотр
Подписаться 2 Средний Комментировать
Решения вопроса 1
AlexXYZ
@AlexXYZ Автор вопроса
O Keep Clear O
Нашёл решение. На основе кода: https://github.com/joewalker/devtools-window/blob/...

public static void NotifySystemOfNewRegistration() {

            tagOPENASINFO info = new tagOPENASINFO();
            info.cszFile = "https";
            info.cszClass = null;
            info.oaifInFlags = tagOPEN_AS_INFO_FLAGS.OAIF_FORCE_REGISTRATION |
                               tagOPEN_AS_INFO_FLAGS.OAIF_URL_PROTOCOL |
                               tagOPEN_AS_INFO_FLAGS.OAIF_REGISTER_EXT;
            SHOpenWithDialog(IntPtr.Zero, ref info);
        }

        // http://msdn.microsoft.com/en-us/library/windows/desktop/bb773363(v=vs.85).aspx 
        private struct tagOPENASINFO {
            [MarshalAs(UnmanagedType.LPWStr)]
            public string cszFile;

            [MarshalAs(UnmanagedType.LPWStr)]
            public string cszClass;

            [MarshalAs(UnmanagedType.I4)]
            public tagOPEN_AS_INFO_FLAGS oaifInFlags;
        }

        [Flags]
        private enum tagOPEN_AS_INFO_FLAGS {
            OAIF_ALLOW_REGISTRATION = 0x00000001,   // Show "Always" checkbox
            OAIF_REGISTER_EXT = 0x00000002,   // Perform registration when user hits OK
            OAIF_EXEC = 0x00000004,   // Exec file after registering
            OAIF_FORCE_REGISTRATION = 0x00000008,   // Force the checkbox to be registration
            OAIF_HIDE_REGISTRATION = 0x00000020,   // Vista+: Hide the "always use this file" checkbox
            OAIF_URL_PROTOCOL = 0x00000040,   // Vista+: cszFile is actually a URI scheme; show handlers for that scheme
            OAIF_FILE_IS_URI = 0x00000080    // Win8+: The location pointed to by the pcszFile parameter is given as a URI
        }

        // http://www.pinvoke.net/default.aspx/shell32.SHOpenWithDialog
        [DllImport("shell32.dll", EntryPoint = "SHOpenWithDialog", CharSet = CharSet.Unicode)]
        private static extern int SHOpenWithDialog(IntPtr hWndParent, ref tagOPENASINFO oOAI);

Результат:

59e7476d5d485533031337.png

Диалоговое окно выводится.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы