Udostępnij przez


Uruchamianie domyślnej aplikacji dla pliku

Dowiedz się, jak uruchomić domyślną aplikację dla pliku z poziomu interfejsu WinUI, platformy uniwersalnej systemu Windows (UWP) lub innej aplikacji klasycznej. Wiele aplikacji musi pracować z plikami, których nie mogą sobie poradzić. Na przykład aplikacje poczty e-mail otrzymują różne typy plików i wymagają sposobu uruchamiania tych plików w domyślnych programach obsługi. W tych krokach pokazano, jak używać interfejsu API Windows.System.Launcher Środowiska uruchomieniowego systemu Windows (WinRT), aby uruchomić domyślną procedurę obsługi pliku, którego aplikacja nie może obsłużyć.

Ważne interfejsy API

W tym temacie przedstawiono następujące interfejsy API:

Notatka

O ile nie określono inaczej, wszystkie interfejsy API WinRT używane w tym temacie mogą być używane zarówno w aplikacjach platformy UWP, aplikacjach WinUI, jak i innych aplikacjach klasycznych. Aby dowiedzieć się więcej na temat umożliwienia aplikacjom klasycznym pracy z interfejsami API środowiska wykonawczego systemu Windows, zobacz Wywoływanie interfejsów API środowiska wykonawczego systemu Windows w aplikacjach klasycznych.

Pobieranie obiektu pliku

Najpierw pobierz obiekt Windows.Storage.StorageFile pliku.

Jeśli plik jest dołączony do pakietu Twojej aplikacji, możesz użyć właściwości Package.InstalledLocation, aby uzyskać obiekt Windows.Storage.StorageFolder, oraz metody Windows.Storage.StorageFolder.GetFileAsync, aby uzyskać obiekt StorageFile.

Jeśli plik znajduje się w znanym folderze, możesz użyć właściwości klasy Windows.Storage.KnownFolders, aby uzyskać StorageFolder i metodę GetFileAsync, aby uzyskać obiekt StorageFile.

Uruchamianie pliku

System Windows udostępnia kilka różnych opcji uruchamiania domyślnej procedury obsługi pliku. Te opcje są opisane na tym wykresie i w poniższych sekcjach.

Opcja Metoda Opis
Uruchamianie domyślne LaunchFileAsync(IStorageFile) Uruchom określony plik za pomocą domyślnej aplikacji.
Otwórz za pomocą uruchamiania LaunchFileAsync(IStorageFile, LauncherOptions) Uruchom określony plik, aby użytkownik wybrał procedurę obsługi za pomocą okna dialogowego Otwórz za pomocą.
Uruchom z zalecaną aplikacją zapasową LaunchFileAsync(IStorageFile, LauncherOptions) Uruchom określony plik za pomocą domyślnego programu. Jeśli program obsługi nie jest zainstalowany w systemie, zalecamy użytkownikowi aplikację w sklepie.
Uruchamianie z żądanym pozostałym widokiem LaunchFileAsync(IStorageFile, LauncherOptions) (tylko system Windows) Uruchom określony plik z domyślną procedurą obsługi. Określ preferencję, aby pozostać na ekranie po uruchomieniu i ustal określony rozmiar okna. LauncherOptions.DesiredRemainingView nie jest obsługiwana w rodzinie urządzeń przenośnych.

Domyślne uruchomienie

Wywołaj metodę Windows.System.Launcher.LaunchFileAsync(IStorageFile), aby uruchomić aplikację domyślną. W tym przykładzie użyto metody Windows.Storage.StorageFolder.GetFileAsync, aby uruchomić plik obrazu, test.png, który znajduje się w pakiecie aplikacji.

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
   }
}
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
      }
   });
}

Otwórz za pomocą uruchamiania

Wywołaj metodę Windows.System.Launcher.LaunchFileAsync(IStorageFile, LauncherOptions) z ustawionymi opcjami LauncherOptions.DisplayApplicationPicker na true, aby uruchomić aplikację wybraną przez użytkownika z okna dialogowego Otwórz za pomocą.

Zalecamy użycie okna dialogowego Otwórz za pomocą, gdy użytkownik może chcieć wybrać aplikację inną niż domyślna dla określonego pliku. Jeśli na przykład aplikacja umożliwia użytkownikowi uruchomienie pliku obrazu, domyślna procedura obsługi będzie prawdopodobnie aplikacją przeglądarki. W niektórych przypadkach użytkownik może chcieć edytować obraz zamiast go wyświetlać. Użyj opcji Otwórz za pomocą wraz z alternatywnym poleceniem w AppBar lub w menu kontekstowym, aby umożliwić użytkownikowi wyświetlenie okna dialogowego Otwórz za pomocą i wybranie aplikacji edytora w tych typach scenariuszy.

otwarte okno dialogowe uruchamiania pliku .png. Okno dialogowe zawiera pole wyboru, które określa, czy wybór użytkownika powinien być używany dla wszystkich plików .png lub tylko ten plik .png. Okno dialogowe zawiera cztery opcje aplikacji służące do uruchamiania pliku i link

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
   }
}
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
      }
   });
}

W niektórych przypadkach użytkownik może nie mieć zainstalowanej aplikacji do obsługi uruchamianego pliku. Domyślnie system Windows będzie obsługiwał te przypadki, udostępniając użytkownikowi link do wyszukiwania odpowiedniej aplikacji w sklepie. Jeśli chcesz nadać użytkownikowi konkretne zalecenie dotyczące aplikacji do uzyskania w tym scenariuszu, możesz to zrobić, przekazując to zalecenie wraz z uruchomionym plikiem. W tym celu wywołaj metodę Windows.System.Launcher.launchFileAsync(IStorageFile, LauncherOptions) za pomocą metody LauncherOptions.PreferredApplicationPackageFamilyName ustawioną na nazwę rodziny pakietów aplikacji w sklepie, którą chcesz zalecić. Następnie ustaw LauncherOptions.PreferredApplicationDisplayName na nazwę tej aplikacji. System Windows użyje tych informacji, aby zastąpić ogólną opcję wyszukiwania aplikacji w sklepie określoną opcją uzyskania zalecanej aplikacji ze Sklepu.

Notatka

Aby zalecić aplikację, należy ustawić obie te opcje. Ustawienie jednego bez drugiego spowoduje awarię.

otwarte okno dialogowe uruchamiania pliku contoso. ponieważ .contoso nie ma programu obsługi zainstalowanego na maszynie, okno dialogowe zawiera opcję z ikoną sklepu i tekstem wskazującym użytkownika na poprawną procedurę obsługi w sklepie. okno dialogowe zawiera również link

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
   }
}
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
      }
   });
}

Uruchamianie z żądanym widokiem pozostałym (tylko platforma UWP)

Aplikacje źródłowe wywołujące LaunchFileAsync mogą zażądać, aby pozostały na ekranie po uruchomieniu pliku. Domyślnie system Windows próbuje udostępnić wszystkie dostępne miejsce w równym stopniu między aplikacją źródłową a aplikacją docelową, która obsługuje plik. Aplikacje źródłowe mogą używać właściwości DesiredRemainingView, aby wskazać systemowi operacyjnemu, że preferują okno aplikacji, aby zajęło mniej lub więcej dostępnego miejsca. DesiredRemainingView można również użyć do wskazania, że aplikacja źródłowa nie musi pozostać na ekranie po uruchomieniu pliku i może zostać całkowicie zastąpiona przez aplikację docelową. Ta właściwość określa tylko preferowany rozmiar okna aplikacji wywołującej. Nie określa ona zachowania innych aplikacji, które mogą wystąpić również na ekranie w tym samym czasie.

Notatka

System Windows uwzględnia wiele różnych czynników podczas określania końcowego rozmiaru okna aplikacji źródłowej, na przykład preferencji aplikacji źródłowej, liczby aplikacji na ekranie, orientacji ekranu itd. Ustawienie DesiredRemainingViewnie gwarantuje określonego zachowania okna dla aplikacji źródłowej.

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
      }
   });
}

Uwagi

Twoja aplikacja nie może wybrać aplikacji, która ma zostać uruchomiona. Użytkownik określa, która aplikacja jest uruchamiana. Użytkownik może wybrać albo aplikację platformy uniwersalnej systemu Windows, albo klasyczną aplikację desktopową systemu Windows.

Podczas uruchamiania pliku aplikacja musi być aplikacją pierwszego planu, czyli musi być widoczna dla użytkownika. To wymaganie pomaga zapewnić, że użytkownik pozostaje pod kontrolą. Aby spełnić to wymaganie, upewnij się, że wszystkie pliki są uruchamiane bezpośrednio w interfejsie użytkownika aplikacji. Najprawdopodobniej użytkownik musi zawsze podjąć jakąś akcję, aby zainicjować uruchomienie pliku.

Nie można uruchomić typów plików zawierających kod lub skrypt, jeśli są one wykonywane automatycznie przez system operacyjny, takie jak .exe, .msii pliki .js. To ograniczenie chroni użytkowników przed potencjalnie złośliwymi plikami, które mogą modyfikować system operacyjny. Za pomocą tej metody można uruchomić typy plików, które mogą zawierać skrypt, jeśli są wykonywane przez aplikację, która izoluje skrypt, na przykład pliki .docx. Aplikacje, takie jak Microsoft Word, przechowują skrypt w plikach .docx przed modyfikowaniem systemu operacyjnego.

Jeśli spróbujesz uruchomić ograniczony typ pliku, uruchomienie zakończy się niepowodzeniem, a zostanie wywołane wywołanie zwrotne błędu. Jeśli aplikacja obsługuje wiele różnych typów plików i oczekujesz, że wystąpi ten błąd, zalecamy udostępnienie użytkownikowi środowiska rezerwowego. Możesz na przykład nadać użytkownikowi opcję zapisania pliku na pulpicie i otworzyć go tam.