使用Metro风格应用程序启动桌面应用程序

15

有没有方法可以在Windows 8的Metro样式应用程序中启动桌面应用程序?我想创建一些简单的快捷方式来替换开始屏幕上不协调的桌面图标。

我只需要非常简单的东西,最好是用C#编写的,在应用程序加载时就能打开一个应用程序。我打算为一些游戏、Photoshop等制作这些快捷方式,而不是我自己制作的任何东西。它们也只是供个人使用,所以我可以使用直接路径到应用程序,比如 "C:\Program Files (x86)\Steam\steamapps\common\Skyrim\TESV.exe"


5
由于系统沙盒限制,您无法启动桌面应用程序(或其他进程)。最好的做法是“启动”一个文件或URI,以启动关联的默认程序 - 可能是桌面应用程序。请注意,这里的“启动”实际上只是打开文件或链接,并不能直接启动应用程序。 - Pavel Minaev
1
“启动”URI,您的意思是? 您可以使用Windows.System.Launcher类完成此操作,具体使用LaunchUriAsync方法。 此方法已在下面的回复中给出。 - Pavel Minaev
一个类似的问题在这里发布了链接我对那个问题的提议回答同样适用于这个问题。 - user533676
5个回答

21

如果您只想运行桌面应用程序,如(记事本、写字板、Internet Explorer等),那么请参阅进程方法ProcessStartInfo类

try
{
// Start the child process.
    Process p = new Process();
    // Redirect the output stream of the child process.
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.FileName = "C:\Path\To\App.exe";
    p.Start();
}

// 实验 2

// Uses the ProcessStartInfo class to start new processes,
// both in a minimized mode.
void OpenWithStartInfo()
{
    ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
    startInfo.WindowStyle = ProcessWindowStyle.Minimized;

    Process.Start(startInfo);

    startInfo.Arguments = "www.northwindtraders.com";

    Process.Start(startInfo);
}
在Windows 8 Metro应用程序中,我发现了这个问题:如何从Metro App启动外部程序。所有的 Metro样式应用程序都在高度沙箱环境中工作,没有办法直接启动一个外部应用程序。你可以尝试使用Launcher类 - 根据您的需要,它可能为您提供可行的解决方案。 检查这个:
我可以使用Windows.System.Launcher.LauncherDefaultProgram(Uri)来调用另一个Metro样式的应用吗? 参考:如何从Metro app中启动桌面应用程序? 尝试这个-我还没有测试过但可能会有所帮助... Launcher.LaunchFileAsync
// Path to the file in the app package to launch
string exeFile = @"C:\Program Files (x86)\Steam\steamapps\common\Skyrim\TESV.exe";

var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(exeFile);

if (file != null)
{
    // Set the option to show the picker
    var options = new Windows.System.LauncherOptions();
    options.DisplayApplicationPicker = true;

    // Launch the retrieved file
    bool success = await Windows.System.Launcher.LaunchFileAsync(file, options);
    if (success)
    {
       // File launched
    }
    else
    {
       // File launch failed
    }
}

谢谢,我下班回家后会试一试,然后可能会接受你的答案。开始屏幕上的丑陋遗留图标让我很烦,所以这真的很有帮助。 - JacobTheDev
第一个看起来像我要找的,但是在“Process”上我一直收到错误提示。 - JacobTheDev

12

我找到了适合我的解决方案。我只需要在我的应用程序中创建一个空的文本文件,并将其命名为 launcher.yourappyouwanttostart,然后使用以下命令运行它:

Windows.System.Launcher.LaunchFileAsync("launcher.yourappyouwanttostart");

第一次启动时,它会要求你为此文件选择关联程序。然后你选择你想要运行的exe文件,从此每次执行此文件时,你的应用程序都会启动。


2
哈哈,哇塞。+1 我得记住这个,以备将来在内部使用的 LOB 应用程序中使用。 - Chris Sinclair

3

我实际上没有尝试过它是否有效,而且这不是一个很好的解决方案,但我猜Metro风格的应用程序可以启动URI。 然后,您可以创建一个桌面程序,该程序已注册自定义URI方案,然后执行实际的程序启动。


1
你可以在你的电脑上托管外部 WCF 服务并进行单独安装,然后通过 localhost 从 Metro 样式应用程序连接到它。这样,你就可以执行包括 Process.Start 在内的几乎任何操作。

请问您能否更清楚地解释一下?什么是外部WCF服务,什么是“带有单独安装”的意思? - Andrew Fox
Windows Communication Foundation。您将能够通过服务与应用程序进行通信并以此方式调用事物。虽然这是一个解决方案,但我建议不要仅为解决此问题而阅读相关资料。现在采取hacky路线,哈。但一定要了解WCF,它是一个很棒的平台,我主要用于在Web上发送数据(REST / SOAP等)。 - Billy Jake O'Connor

0

我喜欢简单的东西,所以我的解决方案是使用这个:

Process.Start("explorer", "shell:AppsFolder\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe!App")

这将启动随着周年更新一起推出的“新”便笺,但它适用于我测试过的所有其他“Metro”应用程序。 要查找Metro应用程序的名称,您必须在Windows资源管理器中使用AppUserModelId列在shell:appsfolder中找到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接