2012-03-02 119 views
15

有没有办法在Windows 8上从Metro风格的应用程序启动桌面应用程序?我正在尝试为桌面应用程序创建一些简单的快捷方式来替换开始屏幕上的桌面图标,这看起来不合适。使用Metro风格的应用程序启动桌面应用程序

我只是需要一些超级简单的东西,最好在C#中,在应用程序加载后立即打开应用程序。我打算为某些游戏,photoshop等制作这些快捷方式,而不是我自己制作的任何东西。他们还只是供个人使用的,这样我就可以使用直接路径应用程序,如"C:\Program Files (x86)\Steam\steamapps\common\Skyrim\TESV.exe"

+5

由于沙箱,您无法启动桌面应用程序(或其他进程)。您可以做的最好做法是“启动”文件或URI,以便启动关联的默认程序(可能是桌面应用程序)。 – 2012-03-02 07:25:41

+0

那我该怎么做? – JacobTheDev 2012-03-06 19:03:48

+1

“启动”URI,你的意思是?你使用'Windows.System.Launcher'类,特别是'LaunchUriAsync'方法。它在下面的回复之一中给出。 – 2012-03-06 20:01:01

回答

21

如果你只是想运行像(记事本,写字板,IE浏览器等)的桌面应用程序然后再通过Process MethodsProcessStartInfo Class

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应用我发现了这一点:How to Start a external Program from Metro App

所有的Metro风格的应用程序工作在高沙盒 环境中,并且没有办法直接启动外部应用程序 。

您可以尝试使用Launcher class - 取决于您的需要它可能为 提供了一个可行的解决方案。

检查:
Can I use Windows.System.Launcher.LauncherDefaultProgram(Uri) to invoke another metro style app?

编号:How to launch a Desktop app from within a Metro app?

地铁IE是一个特殊的应用程序。您不能从Metro风格的应用程序调用可执行文件。

试试这个 - 我还没有测试,但还可能会帮助你..

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 
    } 
} 
+0

谢谢,当我下班回家时,我会采取一个重击它,并可能接受你的然后回答。开始屏幕上的丑陋遗留图标会让我感到紧张,所以这真的很有帮助。 – JacobTheDev 2012-03-02 13:23:43

+0

第一个看起来像我正在寻找的东西,但我一直在“过程”上发生错误。 – JacobTheDev 2012-03-06 19:00:44

+0

@Rev哪种解决方案对您有用? – jackjop 2014-08-12 13:36:01

3

我还没有真正尝试,如果它的工作原理,它是不是一个真正的漂亮的解决方案,但我猜Metro风格的应用程序可以启动一个URI。 然后,您可以创建一个桌面程序,该程序注册了一个自定义URI方案,然后执行实际的程序启动。

1

您可以做的是在您的计算机上安装独立安装的外部WCF服务,并使用localhost从metro风格的应用程序连接到它。然后你可以做任何事情,包括Process.Start。

+0

请你能更清楚地解释一下吗?什么是外部WCF服务,以及“单独安装”是什么意思? – 2015-08-05 03:38:44

+0

Windows Communication Foundation。您可以通过该服务与应用程序进行通信,并以这种方式调用事件。虽然这是我推荐的一种解决方案,但为解决此问题的唯一目的,不值得阅读。哈,现在走哈克路线。但是deffo阅读了WCF,我使用它的主要目的是通过网络发送数据(REST/SOAP等) – 2015-09-01 10:34:30

12

我找到了适合我的解决方案。我只是在我的应用程序由一个空的文本文件,并把它称为launcher.yourappyouwanttostart,然后用

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

它要求你的ASSOCATION该文件,然后你选择exe文件要运行并执行它在第一次启动从现在开始,每次你执行这个文件时,你的应用程序都会启动。

+0

哈哈......很好的黑客! – 2012-09-13 21:59:00

+2

哈哈,哦,哇。 +1我将不得不为LOB内部使用应用程序记住这一点。 – 2013-05-20 13:44:06

0

我喜欢简单的东西,所以我的解决办法是使用:

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

这将启动“新”粘滞便笺与周年更新即将到Windows 10,但它与所有其他的“新城”的工作原理我测试的应用。 要从Windows资源管理器中找到metro应用程序的名称,必须使用AppUserModelId列在shell:appsfolder中找到它。

相关问题