You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C++启动Windows Photos应用并打开多份图片文件?

解决Windows Photos批量打开图片的问题

我来帮你搞定这个困扰:不管是让Photos一次性打开多张图,还是解决IApplicationActivationManager的报错,都有可行的办法,咱们一步步来:

方案1:用ShellExecute一次性传递所有图片路径(最简单)

你之前用ShellExecute打开单张图时切换按钮禁用,是因为Photos只收到了单个文件的请求,自然认为没有其他图片可切换。那直接把所有要打开的图片路径作为参数传给Photos就行,这样它会一次性加载所有图片,切换按钮就能正常用了。

注意:如果图片路径包含空格,一定要用双引号把路径包起来,避免解析出错。代码示例如下:

#include <windows.h>
#include <shellapi.h>

int main() {
    // 示例:多个图片路径,带空格的路径必须用双引号包裹
    const wchar_t* files = L"\"C:\\YourPath\\img1.jpg\" \"C:\\YourPath\\img2.png\" \"C:\\YourPath\\My Vacation Photo.jpg\"";
    
    // 用Photos的AppUserModelId启动,确保调用的是官方Photos应用
    ShellExecuteW(NULL, L"open", L"Microsoft.Windows.Photos_8wekyb3d8bbwe!App", files, NULL, SW_SHOWNORMAL);
    
    return 0;
}

这里用Microsoft.Windows.Photos_8wekyb3d8bbwe!App作为启动目标,这是Photos固定的AppUserModelId,不用担心版本变化找不到可执行文件。

方案2:修复IApplicationActivationManager::ActivateForFile的报错

你遇到的0x80270255错误,本质是Windows Photos注册了多个文件激活扩展,系统不知道该用哪个来处理图片文件。解决办法是找到Photos对应的具体扩展ID,然后在激活时指定这个ID即可。

下面是完整的C++代码实现,包含获取扩展ID和激活打开多图的逻辑:

#include <windows.h>
#include <shobjidl.h>
#include <appmodel.h>
#include <vector>
#include <wrl/client.h>

using namespace Microsoft::WRL;

int main() {
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    if (FAILED(hr)) return hr;

    // 第一步:获取Windows Photos的包全名
    wchar_t packageFullName[MAX_PATH];
    UINT32 packageFullNameLength = ARRAYSIZE(packageFullName);
    hr = FindPackagesByPackageFamily(L"Microsoft.Windows.Photos_8wekyb3d8bbwe", &packageFullNameLength, packageFullName);
    if (FAILED(hr)) { CoUninitialize(); return hr; }

    // 第二步:获取包的文件激活扩展
    PackageManager pm;
    ComPtr<IPackage> package;
    hr = pm.FindPackageByFullName(packageFullName, &package);
    if (FAILED(hr)) { CoUninitialize(); return hr; }

    ComPtr<IPackageExtensions> extensions;
    hr = package->GetExtensions(PACKAGE_EXTENSION_CATEGORY_FILE_ACTIVATION, &extensions);
    if (FAILED(hr)) { CoUninitialize(); return hr; }

    // 第三步:遍历扩展,找到可用的图片激活扩展
    ComPtr<IIterable<IPackageExtension*>> iterable;
    hr = extensions->First(&iterable);
    if (FAILED(hr)) { CoUninitialize(); return hr; }

    ComPtr<IIterator<IPackageExtension*>> iterator;
    hr = iterable->First(&iterator);
    if (FAILED(hr)) { CoUninitialize(); return hr; }

    BOOL hasCurrent;
    hr = iterator->HasCurrent(&hasCurrent);
    while (hasCurrent && SUCCEEDED(hr)) {
        ComPtr<IPackageExtension> ext;
        hr = iterator->GetCurrent(&ext);
        if (SUCCEEDED(hr)) {
            wchar_t extId[MAX_PATH];
            UINT32 extIdLength = ARRAYSIZE(extId);
            hr = ext->GetId(&extIdLength, extId);
            if (SUCCEEDED(hr)) {
                // 准备要打开的文件列表
                std::vector<IShellItem*> fileItems;

                // 添加第一个图片文件
                ComPtr<IShellItem> item1;
                hr = SHCreateItemFromParsingName(L"C:\\YourPath\\img1.jpg", NULL, IID_PPV_ARGS(&item1));
                if (SUCCEEDED(hr)) fileItems.push_back(item1.Get());

                // 添加第二个图片文件
                ComPtr<IShellItem> item2;
                hr = SHCreateItemFromParsingName(L"C:\\YourPath\\img2.png", NULL, IID_PPV_ARGS(&item2));
                if (SUCCEEDED(hr)) fileItems.push_back(item2.Get());

                // 第四步:用指定的扩展ID激活并打开文件
                ComPtr<IApplicationActivationManager> activationManager;
                hr = CoCreateInstance(CLSID_ApplicationActivationManager, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&activationManager));
                if (SUCCEEDED(hr)) {
                    DWORD processId;
                    hr = activationManager->ActivateForFile(extId, fileItems.size(), fileItems.data(), L"", &processId);
                    if (SUCCEEDED(hr)) {
                        // 成功激活,跳出循环
                        break;
                    }
                }
            }
        }
        hr = iterator->MoveNext(&hasCurrent);
    }

    CoUninitialize();
    return hr;
}

这个方法通过精准指定激活扩展,解决了歧义问题,能可靠地让Photos批量打开图片。

方案3:先启动Photos再传入文件(不推荐)

虽然可以通过模拟拖拽文件到Photos窗口,或者发送Windows消息的方式传入文件,但这种方法非常不稳定——Photos的窗口结构会随版本更新变化,后续维护成本极高,所以优先推荐前两种方案。

内容的提问来源于stack exchange,提问作者Jiten Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:38:35