Ответы с форумов MSDN

Программный запуск UWP-приложения в Windows

Date: 11.11.2018 7:15:39

Если это ваше UWP-приложение, вероятно, вам нужно выполнить действия, описанные здесь: Command-Line Activation of Universal Windows Apps

После этого вы сможете запускать его как обычную команду: Process.Start("cmd.exe","...");

Для запуска произвольных приложений есть вот такой способ (требует наличия App Certification Kit на целевой машине): Run Windows Store Apps From Desktop

Message 344

Date: 12.11.2018 8:37:15

Предлагаю такой способ. У большинства UWP приложений определен свой протокол URL, через который его можно открывать в проводнике (например, Edge можно открыть, набрав "microsoft-edge://"). Эти протоколы можно вытащить из ветки реестра HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\PackageRepository\Packages\(PackageID)\(AppUserModelID)\windows.protocol. Таким образом, можно вытащить список AppUserModelID и протоколов для всех приложений, имеющих протокол запуска, и запускать приложение передавая в Process.Start протокол. 

XAML:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        
        mc:Ignorable="d"
        Title="Store Apps" Height="400" Width="600">
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
        
        <ListBox x:Name="listbox" 
                 HorizontalAlignment="Stretch" Margin="40,40,40,40" 
                 VerticalAlignment="Stretch"  MouseDoubleClick="listbox_MouseDoubleClick"/>

    </Grid>
</Window>

C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.ComponentModel;
using System.Windows.Controls;
using Microsoft.Win32;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        List<StoreApp> applist; //список UWP-приложений

        public MainWindow()
        {
            InitializeComponent();

            try
            {
                LoadApps();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error");
            }
        }

        //загружает список UWP-приложений
        void LoadApps()
        {
            //словарь для хранения соответствия AppUserModelID и протоколов
            Dictionary<string, string> protocolsdic = new Dictionary<string, string>();
            
            //открываем раздел реестра со списком пакетов
            string basepath = "Local Settings\\Software\\Microsoft\\Windows\\CurrentVersion\\AppModel\\PackageRepository\\Packages\\";
            RegistryKey key = Registry.ClassesRoot.OpenSubKey(basepath);
            if (key == null) throw new Exception("Cannot open 'Packages' registry key!");

            RegistryKey subkey_package;
            RegistryKey subkey_app;
            RegistryKey subkey_protocols;

            using (key)
            {
                string[] packages = key.GetSubKeyNames(); //получаем список пакетов

                foreach (string package in packages)
                {
                    subkey_package = key.OpenSubKey(package);

                    using (subkey_package)
                    {
                        //получаем список приложений в пакете
                        string[] package_apps = subkey_package.GetSubKeyNames(); 

                        foreach (string package_app in package_apps)
                        {
                            subkey_app = subkey_package.OpenSubKey(package_app);

                            using (subkey_app)
                            {
                                string[] subkeys = subkey_app.GetSubKeyNames();

                                //если у приложения есть протокол, занесем его в словарь
                                if (subkeys.Contains("windows.protocol"))
                                {
                                    subkey_protocols = subkey_app.OpenSubKey("windows.protocol");
                                    using (subkey_protocols)
                                    {
                                        string[] protocols = subkey_protocols.GetSubKeyNames();

                                        if (protocols.Length > 0)
                                        {
                                            if (!protocolsdic.ContainsKey(package_app))
                                                protocolsdic.Add(package_app, protocols[0]);
                                        }
                                    }

                                }//endif
                            }

                        }//end foreach
                    }



                }//end foreach
            }

            applist = new List<StoreApp>(protocolsdic.Count);

            foreach (string x in protocolsdic.Keys)
            {
                //проверим, реально ли зарегистрирован такой протокол запуска в системе...
                RegistryKey classkey = Registry.ClassesRoot.OpenSubKey(protocolsdic[x]);
                using (classkey)
                {
                    if (classkey != null)
                    {
                        //если зарегистрирован, добавляем элемент в список
                        applist.Add(new StoreApp { AppUserModelID = x, Protocol = protocolsdic[x] });
                    }
                }
            }

            //задаем привязки ListBox...
            listbox.ItemsSource = applist;
            listbox.DisplayMemberPath = "AppUserModelID";
        }
               


        private void listbox_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            //получаем текущий элемент списка
            StoreApp app = listbox.SelectedItem as StoreApp;

            if (app != null)
            {
                try
                {
                    //пытаемся запустить протокол через Shell
                    System.Diagnostics.Process.Start(app.Protocol + "://");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString(), "Error");
                }
            }
        }
    }

    public class StoreApp
    {
        public string AppUserModelID { get; set; }

        public string Protocol { get; set; }
    }
    
}


Так это выглядит у меня:




Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub