Dosya için varsayılan uygulamayı başlatma

WinUI'nizden veya başka bir masaüstü uygulamanızdan bir dosya için varsayılan uygulamayı başlatmayı öğrenin. Birçok uygulamanın, işleyemedikleri dosyalarla çalışması gerekir. Örneğin, e-posta uygulamaları çeşitli dosya türlerini alır ve bu dosyaları varsayılan işleyicilerinde başlatmak için bir yönteme ihtiyaç duyar. Bu adımlar, uygulamanızın kendisi işleyemediği bir dosya için varsayılan işleyiciyi başlatmak üzere Windows.System.Launcher Windows Çalışma Zamanı (WinRT) API'sinin nasıl kullanılacağını gösterir.

Önemli API'ler

Bu konuda aşağıdaki API'ler yer aldı:

Uyarı

Aksi belirtilmediği sürece, bu konuda kullanılan tüm WinRT API'leri hem WinUI uygulamalarında hem de diğer masaüstü uygulamalarında kullanılabilir. Masaüstü uygulamanızın WinRT API'leriyle çalışmasını sağlama hakkında daha fazla bilgi için bkz. Masaüstü uygulamalarında Windows Çalışma Zamanı API'lerini çağırma.

Dosya nesnesini alma

İlk olarak, dosya için bir Windows.Storage.StorageFile nesnesi alın.

Dosya uygulamanızın paketine eklenmişse, Bir Windows.Storage.StorageFolder nesnesi almak için Package.InstalledLocation özelliğini ve StorageFile nesnesini almak için Windows.Storage.StorageFolder.GetFileAsync yöntemini kullanabilirsiniz.

Dosya bilinen bir klasördeyse, StorageFolder almak için Windows.Storage.KnownFolders sınıfının özelliklerini ve StorageFile nesnesini almak için GetFileAsync yöntemini kullanabilirsiniz.

Dosyayı başlatma

Windows, bir dosya için varsayılan işleyiciyi başlatmak için çeşitli seçenekler sağlar. Bu seçenekler bu grafikte ve izleyen bölümlerde açıklanmıştır.

Seçenek Yöntem Açıklama
Varsayılan başlatma LaunchFileAsync(IStorageFile) Belirtilen dosyayı varsayılan işleyiciyle başlatın.
Başlatma ile aç LaunchFileAsync(IStorageFile, LauncherOptions) Kullanıcının birlikte aç iletişim kutusu aracılığıyla işleyiciyi seçmesine izin vermek için belirtilen dosyayı başlatın.
Önerilen bir yedek uygulama ile başlat LaunchFileAsync(IStorageFile, LauncherOptions) Belirtilen dosyayı varsayılan işleyiciyle başlatın. Sistemde hiçbir işleyici yüklü değilse, kullanıcıya mağazada bir uygulama önerin.
İstenen kalan görünümle başlat LaunchFileAsync(IStorageFile, LauncherOptions) (Yalnızca Windows) Belirtilen dosyayı varsayılan işleyiciyle başlatın. Başlatmadan sonra ekranda kalmak için bir tercih belirtin ve belirli bir pencere boyutu isteyin. LauncherOptions.DesiredRemainingView mobil cihaz ailesinde desteklenmez.

Varsayılan başlatma

Varsayılan uygulamayı başlatmak için Windows.System.Launcher.LaunchFileAsync(IStorageFile) yöntemini çağırın. Bu örnekte, uygulama paketinde yer alan test.pngbir görüntü dosyası başlatmak için Windows.Storage.StorageFolder.GetFileAsync yöntemi kullanılır.

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

Başlatma ile aç

Kullanıcının Birlikte Aç iletişim kutusundan seçtiği uygulamayı başlatmak için LauncherOptions.DisplayApplicationPicker değeri true olarak ayarlanmış Windows.System.Launcher.LaunchFileAsync(IStorageFile, LauncherOptions) yöntemini çağırın.

Kullanıcı belirli bir dosya için varsayılandan farklı bir uygulama seçmek istediğinde Birlikte Aç iletişim kutusunu kullanmanızı öneririz. Örneğin, uygulamanız kullanıcının görüntü dosyasını başlatmasına izin veriyorsa varsayılan işleyici büyük olasılıkla bir görüntüleyici uygulaması olacaktır. Bazı durumlarda, kullanıcı görüntüyü görüntülemek yerine düzenlemek isteyebilir. Kullanıcının Birlikte Aç iletişim kutusunu açmasına ve bu tür senaryolarda düzenleyici uygulamasını seçmesine izin vermek için AppBar'daki veya bağlam menüsündeki alternatif bir komutla birlikte Birlikte Aç seçeneğini kullanın.

.png dosya başlatma için birlikte aç iletişim kutusu. iletişim kutusu, kullanıcının seçiminin tüm .png dosyaları için mi yoksa yalnızca bu .png dosya için mi kullanılacağını belirten bir onay kutusu içerir. iletişim kutusu, dosyayı başlatmak için dört uygulama seçeneği ve bir 'diğer seçenekler' bağlantısı içerir.

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

Bazı durumlarda, kullanıcının başlattığınız dosyayı işlemek için yüklü bir uygulaması olmayabilir. Varsayılan olarak, Windows kullanıcıya mağazada uygun bir uygulamayı araması için bir bağlantı sağlayarak bu durumları işler. Kullanıcıya bu senaryoda hangi uygulamayı edineceği konusunda belirli bir öneri vermek isterseniz, bu öneriyi başlatmakta olduğunuz dosyayla birlikte ileterek bunu yapabilirsiniz. Bunu yapmak için LauncherOptions.PreferredApplicationPackageFamilyName ile Windows.System.Launcher.launchFileAsync(IStorageFile, LauncherOptions) yöntemini Store'da önerilen uygulamanın paket ailesi adı olarak ayarlayın. Ardından LauncherOptions.PreferredApplicationDisplayName değerini bu uygulamanın adına ayarlayın. Windows, mağazadaki bir uygulamayı aramanın genel seçeneğini, önerilen uygulamayı Mağaza'dan almak için belirli bir seçenekle değiştirmek için bu bilgileri kullanır.

Uyarı

Bir uygulama önermek için bu seçeneklerin her ikisini de ayarlamanız gerekir. Birini diğerinin olmadan ayarlamak hataya neden olur.

.contoso dosyasını açmak için 'Birlikte Aç' iletişim kutusu. .contoso'nun makinede yüklü bir işleyicisi olmadığından, iletişim kutusunda Mağaza simgesi ve kullanıcıyı mağazadaki doğru işleyiciye yönlendiren metin içeren bir seçenek bulunur. İletişim kutusunda 'diğer seçenekler' bağlantısı da yer alır.

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

İstenen Kalan Görünümle Başlat (yalnızca UWP)

LaunchFileAsync'i çağıran kaynak uygulamalar, bir dosya başlatıldıktan sonra ekranda kalmalarını isteyebilir. Varsayılan olarak, Windows kullanılabilir tüm alanı kaynak uygulama ile dosyayı işleyen hedef uygulama arasında eşit olarak paylaşmaya çalışır. Kaynak uygulamalar, işletim sistemine uygulama pencerelerinin kullanılabilir alandan daha fazla veya daha az yer kaplamasını tercih ettiklerini belirtmek için DesiredRemainingView özelliğini kullanabilir. DesiredRemainingView , kaynak uygulamanın dosya başlatıldıktan sonra ekranda kalması gerekmediğini ve hedef uygulama tarafından tamamen değiştirilebileceğini belirtmek için de kullanılabilir. Bu özellik yalnızca çağrı uygulamasının tercih edilen pencere boyutunu belirtir. Aynı anda ekranda olabilecek diğer uygulamaların davranışını belirtmez.

Uyarı

Windows, kaynak uygulamanın son pencere boyutunu belirlerken, örneğin kaynak uygulamanın tercihini, ekrandaki uygulama sayısını, ekran yönünü vb. birden çok farklı faktörü dikkate alır. desiredRemainingView veayarlayarak, kaynak uygulama için belirli bir pencereleme davranışı garanti edilmez.

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

Açıklamalar

Uygulamanız başlatılan uygulamayı seçemiyor. Hangi uygulamanın başlatıldığını kullanıcı belirler. Kullanıcı bir WinUI uygulaması veya Windows masaüstü uygulaması seçebilir.

Bir dosyayı başlatırken uygulamanızın ön plan uygulaması olması, yani kullanıcının görebilmesi gerekir. Bu gereksinim, kullanıcının denetimde kalmasını sağlamaya yardımcı olur. Bu gereksinimi karşılamak için tüm dosya başlatmalarını doğrudan uygulamanızın kullanıcı arabirimine bağladığınızdan emin olun. Büyük olasılıkla, kullanıcının her zaman bir dosya başlatma işlemi başlatmak için bazı eylemler gerçekleştirmesi gerekir.

.exe, .msive .js dosyaları gibi işletim sistemi tarafından otomatik olarak yürütülürlerse kod veya betik içeren dosya türlerini başlatamazsınız. Bu kısıtlama, kullanıcıları işletim sistemini değiştirebilecek kötü amaçlı olabilecek dosyalardan korur. Bu yöntemi, .docx dosyaları gibi betiği izole eden bir uygulama tarafından çalıştırıldıklarında betik içerebilecek dosya türlerini başlatmak için kullanabilirsiniz. Microsoft Word gibi uygulamalar, .docx dosyalarındaki betiklerin işletim sistemini değiştirmesini önler.

Kısıtlanmış bir dosya türünü çalıştırmaya çalışırsanız, çalıştırma başarısız olur ve hata geri çağırma işleviniz çalıştırılır. Uygulamanız birçok farklı dosya türünü işliyorsa ve bu hataya ulaşmanızı bekliyorsanız, kullanıcınıza bir geri dönüş deneyimi sağlamanızı öneririz. Örneğin, kullanıcıya dosyayı masaüstüne kaydetme seçeneği verebilirsiniz ve orada açabilirler.