如何通过Win32 API检测应用是否从微软商店安装?
检测应用是否来自微软商店的Win32解决方案
方法1:使用Package Manager API(推荐)
微软商店安装的应用属于MSIX/APPX包,可通过Win32的Package Manager API直接查询包来源,这是最可靠的官方方案。
核心步骤:
- 调用
FindPackagesByPackageFamily或FindPackageForUser获取目标应用的包全名 - 通过
GetPackageOrigin判断包来源,当返回值为PACKAGE_ORIGIN_STORE(数值2)时,说明应用来自微软商店
C++示例代码:
#include <windows.h> #include <appmodel.h> #include <iostream> #pragma comment(lib, "appmodel.lib") bool IsAppFromMicrosoftStore(const wchar_t* packageFamilyName) { UINT32 packageCount = 0; UINT32 bufferSize = 0; // 先获取所需缓冲区大小 LONG ret = FindPackagesByPackageFamily(packageFamilyName, &packageCount, nullptr, &bufferSize, nullptr); if (ret != ERROR_INSUFFICIENT_BUFFER) return false; PWSTR* packageFullNames = new PWSTR[packageCount]; ret = FindPackagesByPackageFamily(packageFamilyName, &packageCount, packageFullNames, &bufferSize, nullptr); if (ret != ERROR_SUCCESS || packageCount == 0) { delete[] packageFullNames; return false; } PACKAGE_ORIGIN origin; ret = GetPackageOrigin(packageFullNames[0], &origin); delete[] packageFullNames; return origin == PACKAGE_ORIGIN_STORE; } int main() { // 替换为目标应用的Package Family Name(可通过任务管理器、快捷方式属性获取) const wchar_t* targetPFN = L"YourTargetAppPackageFamilyName"; bool isStoreApp = IsAppFromMicrosoftStore(targetPFN); std::wcout << (isStoreApp ? L"应用来自微软商店" : L"应用为原生安装") << std::endl; return 0; }
注意:该API仅支持Windows 10及以上系统,编译时需链接appmodel.lib。
方法2:注册表路径检测
微软商店应用的注册表配置集中在HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\Repository\Packages下,每个子项对应一个MSIX包,包含来源标识。而原生安装应用的注册表项通常位于HKEY_LOCAL_MACHINE\Software或HKEY_CURRENT_USER\Software的常规路径。
可通过查询上述特定注册表路径是否存在目标应用的包项来判断,但该方法可靠性略低,因为注册表结构可能随系统版本调整。
方法3:安装目录特征判断
微软商店应用默认安装在受系统保护的C:\Program Files\WindowsApps目录,目录名称格式为包名_版本_架构_发布者ID;原生安装应用通常位于C:\Program Files或自定义路径。
若能获取应用的安装路径,可通过路径特征判断,但访问WindowsApps目录需要管理员权限或特殊系统权限,使用场景受限。
内容的提问来源于stack exchange,提问作者kishoredbn
相关产品推荐
相关产品推荐

