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
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