Настольный мост тост открыть приложение

Я разработал приложение WPF, которое я конвертировал через Desktop App Converter и работает нормально.

Я добавил тост-уведомления, вызывающие API-интерфейсы UWP, из настольного приложения, как описано здесь https://blogs.msdn.microsoft.com/tiles_and_toasts/2015/10/16/quickstart-handling-toast-activations-from-win32-apps-in-windows-10/

Но чтобы иметь возможность автоматически открывать приложение, когда пользователь нажимает на тост, мне нужно было создать ярлык и зарегистрировать COM-компонент так же, как https://github.com/WindowsNotifications/desktop-toasts и это тоже нормально.

Я думаю, что это слишком много работы по сравнению с приложением UWP, где поведение по умолчанию - это просто, открытое приложение без какого-либо кода.

Как я могу открыть тост, нажав на значок приложения в конвертированном приложении "Бридж", так же, как настоящий UWP?

Благодарю.

3 ответа

Решение

Я думаю, что это слишком много работы по сравнению с приложением UWP, где поведение по умолчанию - это просто, открытое приложение без какого-либо кода.

Существует простое решение, технические моменты, как следует:

  1. Использование связи протокола, описанной в статье о расширениях приложения Desktop Bridge
  2. Используя протокол ActivationType для запуска соответствующего приложения, см. Адаптивные и интерактивные уведомления о тостах.

Некоторые подробные шаги, которые мы должны отметить:

  1. Используя протокольный тип активации в вашем уведомлении о тостах: <toast activationType='protocol' launch='mytoastsample:'> <visual> <binding template='ToastGeneric'> <text>Click to launch Wpf Toast Sample</text> </binding> </visual> </toast>

  2. После преобразования приложения в приложение UWP нам нужно открыть каталог Output и найти файл AppxManifest.xml.

  3. Добавьте расширение ассоциации протокола в файл AppxManifest.xml.

<Application Id="WpfToastSample" Executable="WpfToastSample.exe" EntryPoint="Windows.FullTrustApplication"> <uap:VisualElements DisplayName="WpfToastSample" Description="WpfToastSample" BackgroundColor="#777777" Square150x150Logo="Assets\SampleAppx.150x150.png" Square44x44Logo="Assets\SampleAppx.44x44.png" /> <Extensions> <uap3:Extension Category="windows.protocol"> <uap3:Protocol Name="mytoastsample" Parameters="/p &quot;%1&quot;" /> </uap3:Extension> </Extensions> </Application>

  1. Следуйте. Конвертируйте ваше приложение в UWP вручную, используя Desktop Bridge, чтобы упаковать и повторно оформить ваше приложение.

Я создал образец здесь

Скриншот (GIF): ССЫЛКА

Это на самом деле проще, чем это. Как только вы используете Desktop Bridge, вы можете создавать тосты так же, как приложения UWP. Нажав на тост, вы запустите приложение Desktop Bridge в правильном режиме. Недавно я опубликовал несколько примеров, которые делают это. Вы можете скачать их из Магазина Windows и найти источники на GitHub. Ссылки и более подробная информация в этом блоге. Дайте мне знать, если это не поможет. При необходимости я могу выслать более краткий пример "Привет, мир" в WPF.

Спасибо, Стефан Вик

Я обнаружил (в моем случае конвертированное вручную приложение WinForms), чтобы всплывающие уведомления (с использованием протокола или активации переднего плана) запускали новые экземпляры приложения. Это хорошо, когда приложение не работает, когда пользователь взаимодействует с тостом. Но это плохо, если приложение работает.

Чтобы обойти это, я использовал Mutex, чтобы второй экземпляр мог корректно завершиться, если другой экземпляр уже существует. Визуальный аргумент toast основан на Main, как если бы он был аргументом командной строки.

Я использую пару помощников для этого, которые находятся на GitHub: https://github.com/dkackman/DesktopBridgeEnvironment

Так что мой Main выглядит так (где SingleInstance а также ExecutionEnvironment типы помощников)

static void Main(string [] args)
{
    using (var instance = new SingleInstance(ExecutionEnvironment.Current.AppId))
    {
        if (instance.IsFirstInstance)
        {
            ExecutionEnvironment.Current.StartupArgs = args;

            HockeyClient.Current.Configure("xxxxxxxxxxxxxxxxxxx");

            try
            {
                HockeyClient.Current.SendCrashesAsync();
            }
            catch { }

            using (var program = new Program())
            {
                program.Show();
            }
        }
    }
}

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

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