启动文件的默认应用

重要的 API

了解如何启动文件的默认应用。 许多应用需要处理无法自行处理的文件。 例如,电子邮件应用接收各种文件类型,并且需要一种方法来在其默认处理程序中启动这些文件。 这些步骤演示如何使用 Windows.System.Launcher API 启动应用无法自行处理的文件的默认处理程序。

获取文件对象

首先,获取 文件的 Windows.Storage.StorageFile 对象。

如果该文件包含在应用的包中,则可以使用 Package.InstalledLocation 属性获取 Windows.Storage.StorageFolder 对象和 Windows.Storage.StorageFolder.GetFileAsync 方法以获取 StorageFile 对象。

如果文件位于已知文件夹中,则可以使用 Windows.Storage.KnownFolders 类的属性获取 StorageFolder GetFileAsync 方法以获取 StorageFile 对象。

启动文件

Windows 提供了几种不同的选项,用于启动文件的默认处理程序。 这些选项将在此图表和以下部分进行介绍。

选项 方法 说明
默认启动 LaunchFileAsync(IStorageFile) 使用默认处理程序启动指定的文件。
“打开时启动” LaunchFileAsync(IStorageFile,LauncherOptions) 启动指定文件,让用户通过“打开方式”对话框选取处理程序。
使用建议的应用回退启动 LaunchFileAsync(IStorageFile,LauncherOptions) 使用默认处理程序启动指定的文件。 如果未在系统上安装处理程序,建议在应用商店中向用户推荐一个应用。
使用所需的剩余视图启动 LaunchFileAsync(IStorageFile, LauncherOptions) (仅限 Windows) 使用默认处理程序启动指定的文件。 指定在启动后保留在屏幕上的首选项并请求特定的窗口大小。 移动设备系列不支持 LauncherOptions.DesiredRemainingView

默认启动

调用 Windows.System.Launcher.LaunchFileAsync(IStorageFile) 方法以启动默认应用。 此示例使用 Windows.Storage.StorageFolder.GetFileAsync 方法启动应用包中包含的映像文件test.png。

async void DefaultLaunch()
{
   // Path to the file in the app package to launch
   string imageFile = @"images\test.png";
   
   var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile);
   
   if (file != null)
   {
      // Launch the retrieved file
      var success = await Windows.System.Launcher.LaunchFileAsync(file);

      if (success)
      {
         // File launched
      }
      else
      {
         // File launch failed
      }
   }
   else
   {
      // Could not find file
   }
}
async Sub DefaultLaunch()
   ' Path to the file in the app package to launch
   Dim imageFile = "images\test.png"
   Dim file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile)
   
   If file IsNot Nothing Then
      ' Launch the retrieved file
      Dim success = await Windows.System.Launcher.LaunchFileAsync(file)

      If success Then
         ' File launched
      Else
         ' File launch failed
      End If
   Else
      ' Could not find file
   End If
End Sub
Windows::Foundation::IAsyncAction MainPage::DefaultLaunch()
{
    auto installFolder{ Windows::ApplicationModel::Package::Current().InstalledLocation() };

    Windows::Storage::StorageFile file{ co_await installFolder.GetFileAsync(L"images\\test.png") };

    if (file)
    {
        // Launch the retrieved file
        bool success = co_await Windows::System::Launcher::LaunchFileAsync(file);
        if (success)
        {
            // File launched
        }
        else
        {
            // File launch failed
        }
    }
    else
    {
        // Could not find file
    }
}
void MainPage::DefaultLaunch()
{
   auto installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;

   concurrency::task<Windows::Storage::StorageFile^getFileOperation(installFolder->GetFileAsync("images\\test.png"));
   getFileOperation.then([](Windows::Storage::StorageFile^ file)
   {
      if (file != nullptr)
      {
         // Launch the retrieved file
         concurrency::task<bool> launchFileOperation(Windows::System::Launcher::LaunchFileAsync(file));
         launchFileOperation.then([](bool success)
         {
            if (success)
            {
               // File launched
            }
            else
            {
               // File launch failed
            }
         });
      }
      else
      {
         // Could not find file
      }
   });
}

“打开时启动”

调用 Windows.System.Launcher.LaunchFileAsync(IStorageFile, LauncherOptions) 方法,将 LauncherOptions.DisplayApplicationPicker 设置为 true 以启动用户从“打开方式”对话框中选择的应用。

当用户可能想要选择特定文件的默认应用以外的应用时,建议使用 “打开使用 ”对话框。 例如,如果你的应用允许用户启动图像文件,则默认处理程序可能是查看器应用。 在某些情况下,用户可能需要编辑图像,而不是查看图像。 使用“打开方式”选项以及 AppBar 或上下文菜单中的替代命令,让用户打开“打开方式”对话框,并在这些类型的方案中选择编辑器应用。

打开.png文件启动对话框。对话框包含一个复选框,用于指定用户选择是否应用于所有.png文件或仅使用此.png文件。对话框包含四个用于启动文件的应用选项和“更多选项”链接。

async void DefaultLaunch()
{
   // Path to the file in the app package to launch
      string imageFile = @"images\test.png";
      
   var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile);

   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
      }
   }
   else
   {
      // Could not find file
   }
}
async Sub DefaultLaunch()

   ' Path to the file in the app package to launch
   Dim imageFile = "images\test.png"

   Dim file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile)

   If file IsNot Nothing Then
      ' Set the option to show the picker
      Dim options = Windows.System.LauncherOptions()
      options.DisplayApplicationPicker = True

      ' Launch the retrieved file
      Dim success = await Windows.System.Launcher.LaunchFileAsync(file)

      If success Then
         ' File launched
      Else
         ' File launch failed
      End If
   Else
      ' Could not find file
   End If
End Sub
Windows::Foundation::IAsyncAction MainPage::DefaultLaunch()
{
    auto installFolder{ Windows::ApplicationModel::Package::Current().InstalledLocation() };

    Windows::Storage::StorageFile file{ co_await installFolder.GetFileAsync(L"images\\test.png") };

    if (file)
    {
        // Set the option to show the picker
        Windows::System::LauncherOptions launchOptions;
        launchOptions.DisplayApplicationPicker(true);

        // Launch the retrieved file
        bool success = co_await Windows::System::Launcher::LaunchFileAsync(file, launchOptions);
        if (success)
        {
            // File launched
        }
        else
        {
            // File launch failed
        }
    }
    else
    {
        // Could not find file
    }
}
void MainPage::DefaultLaunch()
{
   auto installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;

   concurrency::task<Windows::Storage::StorageFile^> getFileOperation(installFolder->GetFileAsync("images\\test.png"));
   getFileOperation.then([](Windows::Storage::StorageFile^ file)
   {
      if (file != nullptr)
      {
         // Set the option to show the picker
         auto launchOptions = ref new Windows::System::LauncherOptions();
         launchOptions->DisplayApplicationPicker = true;

         // Launch the retrieved file
         concurrency::task<bool> launchFileOperation(Windows::System::Launcher::LaunchFileAsync(file, launchOptions));
         launchFileOperation.then([](bool success)
         {
            if (success)
            {
               // File launched
            }
            else
            {
               // File launch failed
            }
         });
      }
      else
      {
         // Could not find file
      }
   });
}

使用建议的应用回退启动

在某些情况下,用户可能尚未安装应用来处理要启动的文件。 默认情况下,Windows 将通过向用户提供搜索应用商店中相应应用的链接来处理这些情况。 如果要向用户提供在此方案中获取的应用的特定建议,可以通过传递该建议以及要启动的文件来执行此操作。 为此,请调用 Windows.System.Launcher.launchFileAsync(IStorageFile, LauncherOptions) 方法,将 LauncherOptions.PreferredApplicationPackageFamilyName 设置为要推荐的应用商店中应用的包系列名称。 然后,将 LauncherOptions.PreferredApplicationDisplayName 设置为该应用的名称。 Windows 将使用此信息替换在应用商店中搜索应用的常规选项,并使用特定选项从应用商店中获取推荐的应用。

注意

必须设置这两个选项才能推荐应用。 在没有另一个的情况下设置一个将导致失败。

打开 .contoso 文件启动对话框。由于 .contoso 计算机上没有安装处理程序,因此对话框包含一个带有存储图标和文本的选项,该选项将用户指向存储区上的正确处理程序。对话框还包含“更多选项”链接。

async void DefaultLaunch()
{
   // Path to the file in the app package to launch
   string imageFile = @"images\test.contoso";

   // Get the image file from the package's image directory
   var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile);

   if (file != null)
   {
      // Set the recommended app
      var options = new Windows.System.LauncherOptions();
      options.PreferredApplicationPackageFamilyName = "Contoso.FileApp_8wknc82po1e";
      options.PreferredApplicationDisplayName = "Contoso File App";

      // Launch the retrieved file pass in the recommended app
      // in case the user has no apps installed to handle the file
      bool success = await Windows.System.Launcher.LaunchFileAsync(file, options);
      if (success)
      {
         // File launched
      }
      else
      {
         // File launch failed
      }
   }
   else
   {
      // Could not find file
   }
}
async Sub DefaultLaunch()

   ' Path to the file in the app package to launch
   Dim imageFile = "images\test.contoso"

   ' Get the image file from the package's image directory
   Dim file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile)

   If file IsNot Nothing Then
      ' Set the recommended app
      Dim options = Windows.System.LauncherOptions()
      options.PreferredApplicationPackageFamilyName = "Contoso.FileApp_8wknc82po1e";
      options.PreferredApplicationDisplayName = "Contoso File App";

      ' Launch the retrieved file pass in the recommended app
      ' in case the user has no apps installed to handle the file
      Dim success = await Windows.System.Launcher.LaunchFileAsync(file)

      If success Then
         ' File launched
      Else
         ' File launch failed
      End If
   Else
      ' Could not find file
   End If
End Sub
Windows::Foundation::IAsyncAction MainPage::DefaultLaunch()
{
    auto installFolder{ Windows::ApplicationModel::Package::Current().InstalledLocation() };

    Windows::Storage::StorageFile file{ co_await installFolder.GetFileAsync(L"images\\test.png") };

    if (file)
    {
        // Set the recommended app
        Windows::System::LauncherOptions launchOptions;
        launchOptions.PreferredApplicationPackageFamilyName(L"Contoso.FileApp_8wknc82po1e");
        launchOptions.PreferredApplicationDisplayName(L"Contoso File App");

        // Launch the retrieved file, and pass in the recommended app
        // in case the user has no apps installed to handle the file.
        bool success = co_await Windows::System::Launcher::LaunchFileAsync(file, launchOptions);
        if (success)
        {
            // File launched
        }
        else
        {
            // File launch failed
        }
    }
    else
    {
        // Could not find file
    }
}
void MainPage::DefaultLaunch()
{
   auto installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;

   concurrency::task<Windows::Storage::StorageFile^> getFileOperation(installFolder->GetFileAsync("images\\test.contoso"));
   getFileOperation.then([](Windows::Storage::StorageFile^ file)
   {
      if (file != nullptr)
      {
         // Set the recommended app
         auto launchOptions = ref new Windows::System::LauncherOptions();
         launchOptions->PreferredApplicationPackageFamilyName = "Contoso.FileApp_8wknc82po1e";
         launchOptions->PreferredApplicationDisplayName = "Contoso File App";
         
         // Launch the retrieved file pass, and in the recommended app
         // in case the user has no apps installed to handle the file.
         concurrency::task<bool> launchFileOperation(Windows::System::Launcher::LaunchFileAsync(file, launchOptions));
         launchFileOperation.then([](bool success)
         {
            if (success)
            {
               // File launched
            }
            else
            {
               // File launch failed
            }
         });
      }
      else
      {
         // Could not find file
      }
   });
}

使用所需剩余视图启动(仅限 Windows)

调用 LaunchFileAsync 的源应用可以请求在文件启动后保持屏幕。 默认情况下,Windows 会尝试在源应用和处理文件的目标应用之间平等共享所有可用空间。 源应用可以使用 DesiredRemainingView 属性向操作系统指示,其希望其应用窗口占用更多或更少的可用空间。 DesiredRemainingView 还可用于指示源应用不需要在文件启动后保持屏幕,并且可以完全由目标应用替换。 此属性仅指定调用应用的首选窗口大小。 它不指定可能同时处于屏幕上的其他应用的行为。

注意

Windows 在确定源应用的最终窗口尺寸时会考虑多个不同因素;例如,源应用的首选项、屏幕上的应用数量以及屏幕的方向等。 通过设置 DesiredRemainingView,你无法保证源应用的特定窗口化行为。

**移动设备系列:**LauncherOptions.DesiredRemainingView 在移动设备系列上不受支持。

async void DefaultLaunch()
{
   // Path to the file in the app package to launch
   string imageFile = @"images\test.png";
   
   var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile);

   if (file != null)
   {
      // Set the desired remaining view
      var options = new Windows.System.LauncherOptions();
      options.DesiredRemainingView = Windows.UI.ViewManagement.ViewSizePreference.UseLess;

      // Launch the retrieved file
      bool success = await Windows.System.Launcher.LaunchFileAsync(file, options);
      if (success)
      {
         // File launched
      }
      else
      {
         // File launch failed
      }
   }
   else
   {
      // Could not find file
   }
}
Windows::Foundation::IAsyncAction MainPage::DefaultLaunch()
{
    auto installFolder{ Windows::ApplicationModel::Package::Current().InstalledLocation() };

    Windows::Storage::StorageFile file{ co_await installFolder.GetFileAsync(L"images\\test.png") };

    if (file)
    {
        // Set the desired remaining view.
        Windows::System::LauncherOptions launchOptions;
        launchOptions.DesiredRemainingView(Windows::UI::ViewManagement::ViewSizePreference::UseLess);

        // Launch the retrieved file.
        bool success = co_await Windows::System::Launcher::LaunchFileAsync(file, launchOptions);
        if (success)
        {
            // File launched
        }
        else
        {
            // File launch failed
        }
    }
    else
    {
        // Could not find file
    }
}
void MainPage::DefaultLaunch()
{
   auto installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;

   concurrency::task<Windows::Storage::StorageFile^> getFileOperation(installFolder->GetFileAsync("images\\test.png"));
   getFileOperation.then([](Windows::Storage::StorageFile^ file)
   {
      if (file != nullptr)
      {
         // Set the desired remaining view.
         auto launchOptions = ref new Windows::System::LauncherOptions();
         launchOptions->DesiredRemainingView = Windows::UI::ViewManagement::ViewSizePreference::UseLess;

         // Launch the retrieved file.
         concurrency::task<bool> launchFileOperation(Windows::System::Launcher::LaunchFileAsync(file, launchOptions));
         launchFileOperation.then([](bool success)
         {
            if (success)
            {
               // File launched
            }
            else
            {
               // File launch failed
            }
         });
      }
      else
      {
         // Could not find file
      }
   });
}

注解

你的应用无法选择启动的应用。 由用户决定要启动的应用。 用户可以选择通用 Windows 平台(UWP)应用或 Windows 桌面应用。

启动文件时,应用必须是前台应用,也就是说,它必须对用户可见。 此要求有助于确保用户保持掌控。 若要满足此要求,请确保将所有文件启动直接绑定到应用的 UI。 很可能,用户必须始终采取一些操作来启动文件启动。

如果操作系统自动执行包含代码或脚本的文件类型,则无法启动文件类型,例如.exe、.msi和.js文件。 此限制可保护用户免受可能修改操作系统的潜在恶意文件的影响。 可以使用此方法启动可包含脚本的文件类型(如果由隔离脚本的应用执行),例如,.docx文件。 Microsoft Word 等应用将脚本保留在.docx文件中,以修改操作系统。

如果尝试启动受限文件类型,启动将失败,并且将调用错误回调。 如果你的应用处理了许多不同类型的文件,并且你期望你遇到此错误,我们建议你为用户提供回退体验。 例如,你可以向用户提供将文件保存到桌面的选项,并且可以在桌面上打开该文件。

任务

准则

参考