2016-07-22 2 views
1

J'utilise la classe PackageManager pour répertorier les applications de style métro installées dans le système.Obtention du nom d'affichage exact des applications de style métro

PackageId.Name ne renvoie pas le nom réel du package, Ni Package.DisplayName. Package.DisplayName renvoie une chaîne vide. Il renvoie le nom d'affichage uniquement pour Package.Current.

Quand j'ai essayé d'utiliser AppxManifest.xml, je ne pouvais pas obtenir le nom d'affichage de
Package-> Propriétés-> Displayname aussi. Où puis-je obtenir le nom d'affichage exact des applications de style métro?

<Properties> 
<DisplayName>ms-resource:///Resources/AppStoreName</DisplayName> 
<PublisherDisplayName>Microsoft Corporation</PublisherDisplayName> 
<Logo>Assets\WindowsIcons\StoreLogo.png</Logo> 
</Properties> 

Répondre

0

Si vous avez déjà une référence à une instance Package, vous pouvez obtenir le nom complet à l'aide d'une méthode d'interopérabilité et du registre. Voici un exemple complet:

using Microsoft.Win32; 
using System; 
using System.Runtime.InteropServices; 
using System.Text; 
using Windows.ApplicationModel; 

public class PackageUtil 
{ 
    [DllImport("shlwapi.dll", BestFitMapping = false, CharSet = CharSet.Unicode, 
     ExactSpelling = true, SetLastError = false, ThrowOnUnmappableChar = true)] 

    private static extern int SHLoadIndirectString(string pszSource, 
     StringBuilder pszOutBuf, int cchOutBuf, IntPtr ppvReserved); 

    private static string GetPackageDisplayName(Package package) 
    { 
     using (var key = Registry.ClassesRoot.OpenSubKey(
      @"Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel" + 
      [email protected]"\Repository\Packages\{package.Id.FullName}\App\Capabilities")) 
     { 
      var sb = new StringBuilder(256); 
      Shlwapi.SHLoadIndirectString((string)key.GetValue("ApplicationName"), 
       sb, sb.Capacity, IntPtr.Zero); 
      return sb.ToString(); 
     } 
    } 
}