none
Как из WPF приложения запустить UWP приложение или же WinRT C#

Ответы

  • Предлагаю такой способ. У большинства 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; }
        }
        
    }
    
    
    

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



    12 ноября 2018 г. 8:37

Все ответы

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

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

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

    • Предложено в качестве ответа Azat Tazayan 11 ноября 2018 г. 10:02
    11 ноября 2018 г. 7:15
  • А можно дать конкретный код для запуска приложения UWP?

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

    11 ноября 2018 г. 18:00
  • Предлагаю такой способ. У большинства 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; }
        }
        
    }
    
    
    

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



    12 ноября 2018 г. 8:37