【问题标题】:Launching a Desktop Application with a Metro-style app使用 Metro 风格应用程序启动桌面应用程序
【发布时间】:2012-03-20 14:56:32
【问题描述】:

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

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

【问题讨论】:

  • 由于沙盒,您无法启动桌面应用程序(或其他一般进程)。您可以做的最好的事情是“启动”一个文件或 URI,以便启动相关的默认程序(可能是桌面应用程序)。
  • “启动”URI,你的意思是?为此,您使用 Windows.System.Launcher 类,特别是 LaunchUriAsync 方法。它是在以下答复之一中给出的。
  • here 发布了一个类似的问题。 My proposed answer to that question也适用于这个问题

标签: c# windows windows-8 microsoft-metro


【解决方案1】:

如果您只是想运行桌面应用程序(如记事本、写字板、Internet Explorer 等),请通过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?

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

【讨论】:

  • 谢谢,我下班回家会好好研究一下,然后可能会接受你的回答。开始屏幕上丑陋的旧图标让我很紧张,所以这真的很有帮助。
  • 第一个看起来像我要找的,但我在“进程”上不断收到错误。
【解决方案2】:

我找到了适合我的解决方案。我刚刚在我的应用程序中创建了一个空文本文件并将其命名为launcher.yourappyouwanttostart,然后使用

执行它
Windows.System.Launcher.LaunchFileAsync("launcher.yourappyouwanttostart");

在第一次启动时,它会询问您此文件的关联,然后您选择要运行的 exe 文件,从现在开始,每次执行此文件时,您的应用都会启动。

【讨论】:

  • 哈哈,哇哦。 +1 对于 LOB 内部使用的应用程序,我必须记住这一点。
【解决方案3】:

我还没有真正尝试过它是否有效并且它不是一个真正漂亮的解决方案,但我猜 Metro 风格的应用程序可以启动一个 URI。 然后,您可以创建一个为自定义 URI 方案注册的桌面程序,然后执行实际的程序启动。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 你能解释清楚一点吗?什么是外部 WCF 服务,“单独安装”是什么意思?
    • Windows 通信基础。您将能够通过服务与应用程序进行通信并以这种方式调用事物。虽然这是我推荐的解决方案,但仅出于解决此问题的目的不值得阅读。现在就走老路,哈。但是 deffo 阅读了 WCF,这是一个很棒的平台,我主要使用它来通过网络发送数据(REST/SOAP 等)
    【解决方案5】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多