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