我希望获取在Windows 10上已安装并可执行的应用程序列表,即用户可以启动的应用程序的可执行文件(UWP和非UWP)。对于UWP应用程序,我想获取其AppUserModelId。对于非UWP应用程序,我想获取可执行文件的文件位置。
到目前为止,我尝试过: 1)通过查找注册表并迭代遍历已安装的应用程序(链接1)。但是,该方法会遍历所有已安装的应用程序,返回的列表将包括我想要消除的内容,例如“microsoft asp.net core 2.1.8 shared framework (x64)”。 2)我发现我可以通过特殊的
我使用的相关代码枚举了Appsfolder文件:
到目前为止,我尝试过: 1)通过查找注册表并迭代遍历已安装的应用程序(链接1)。但是,该方法会遍历所有已安装的应用程序,返回的列表将包括我想要消除的内容,例如“microsoft asp.net core 2.1.8 shared framework (x64)”。 2)我发现我可以通过特殊的
Appsfolder
访问所需内容,通过在资源管理器窗口或运行中输入“shell:Appsfolder”来实现。到目前为止,我已能够访问此文件夹,并遍历其中的项目并列出文件名称。但是,我不确定如何收集有关AppUserModelId(对于UWP应用程序)和文件路径(对于WPF应用程序)的信息。我使用的相关代码枚举了Appsfolder文件:
namespace AppsFolder
{
...
public static class AppsFolder
{
...
// GUID for shell:Appsfolder
public static readonly Guid KnownFolderID = new Guid("1e87508d-89c2-42f0-8a7e-645a0f50ca58");
public static IEnumerable<string> GetItemNames(ESHGDN gdn)
{
IShellFolder appsFolder = GetAppsFolder();
try
{
IntPtr enumIDListInterfacePointer;
appsFolder.EnumObjects(IntPtr.Zero,
ESHCONTF.SHCONTF_NONFOLDERS | ESHCONTF.SHCONTF_FOLDERS,
out enumIDListInterfacePointer);
using (var enumIDList = new
EnumIDListWrapper(enumIDListInterfacePointer))
{
var names = new List<string>();
foreach (var pidl in enumIDList)
{
STRRET name;
recycleBin.GetDisplayNameOf(
pidl.DangerousGetHandle(),
gdn,
out name);
names.Add(STRRETToString(ref name, pidl));
if (name.uType != (int)STRRETType.Offset)
Marshal.FreeCoTaskMem(name.data.pOleStr);
}
return names;
}
}
finally
{
Marshal.FinalReleaseComObject(recycleBin);
}
}
private static IShellFolder GetAppsFolder()
{
IShellFolder desktop;
NativeMethod.SHGetDesktopFolder(out desktop);
try
{
Guid shellFolderInterfaceId = typeof(IShellFolder).GUID;
IntPtr recycleBinShellFolderInterfacePointer;
desktop.BindToObject(
GetItemIDList().DangerousGetHandle(),
IntPtr.Zero,
ref shellFolderInterfaceId,
out recycleBinShellFolderInterfacePointer);
return (IShellFolder)Marshal.GetObjectForIUnknown(
recycleBinShellFolderInterfacePointer);
}
finally
{
Marshal.FinalReleaseComObject(desktop);
}
}
public static SafeCoTaskMemHandleZeroIsInvalid GetItemIDList()
{
SafeCoTaskMemHandleZeroIsInvalid pidl;
Guid guid = KnownFolderID;
NativeMethod.SHGetKnownFolderIDList(
ref guid, 0, IntPtr.Zero, out pidl);
return pidl;
}
}
}
执行者为:
string[] names = AppsFolder.GetItemNames(AppsFolder.ESHGDN.SHGDN_INFOLDER).ToArray();
for (int i=0; i<names.Length; i++)
{
Console.WriteLine(names[i]);
}
ILaunchSourceAppUserModelID
接口提供了获取AppUserModelID的方法,但我不确定如何通过我的IShellFolder接口访问此接口。另外,我如何获取AppsFolder虚拟文件夹中实际exe文件的位置?