C++ C++;使用ChangeParametersInfo更改桌面不工作GetLastError返回0

C++ C++;使用ChangeParametersInfo更改桌面不工作GetLastError返回0,c++,winapi,desktop,C++,Winapi,Desktop,我正在尝试使用以下代码更改Windows7计算机上的墙纸。我用多字节字符集编译 if(SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, L"c:\\temp\\extracted.png", SPIF_SENDCHANGE) != 0) { std::cout << "Success !" << std::endl; } else { std::cout << "Failure :(" <<

我正在尝试使用以下代码更改Windows7计算机上的墙纸。我用多字节字符集编译

if(SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, L"c:\\temp\\extracted.png", SPIF_SENDCHANGE) != 0)
{
    std::cout << "Success !" << std::endl;
}
else
{
    std::cout << "Failure :(" << std::endl;
    std::cout << "Error: " << GetLastError() << std::endl;
    system("title :(");
}
if(系统参数sinfow(SPI\u SETDESKWALLPAPER,0,L“c:\\temp\\extracted.png”,SPIF\u SENDCHANGE)!=0)
{

std::cout根据对注释的建议,我放弃了ChangeParametersInfo并实现了我发现的这个快速功能。立即生效

void  SetWallpaper(LPCWSTR file) 
 {
    CoInitializeEx(0, COINIT_APARTMENTTHREADED);
    IActiveDesktop* desktop;
    HRESULT status = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**)&desktop);
    WALLPAPEROPT wOption;
    ZeroMemory(&wOption, sizeof(WALLPAPEROPT));
    wOption.dwSize = sizeof(WALLPAPEROPT);
    wOption.dwStyle = WPSTYLE_CENTER;
    status = desktop->SetWallpaper(file, 0);
    status = desktop->SetWallpaperOptions(&wOption, 0);
    status = desktop->ApplyChanges(AD_APPLY_ALL);
    desktop->Release();
    CoUninitialize();
}
用法

SetWallpaper(L"c:\\temp\\extracted.png");
这比使用旧版本要容易得多。仍然想知道为什么它没有给出错误。希望这能帮助其他人。
谢谢大家的建议。

SPI_SetdeskWallper接受.png文件吗?从我在互联网上发现的情况来看,它似乎接受。MSDN没有提供信息:“SPI_SetdeskWallper 0x0014注意:当使用SPI_SetdeskWallper标志时,除非出现错误,否则系统参数信息将返回TRUE(比如当指定的文件不存在时)。“我会尝试使用.bmp文件进行检查。您需要保存
GetLastError()
在调用
systemparameters sinfow
之后和
cout
之前,可以将其重置。尝试将
SPIF\u UPDATEINIFILE | SPIF\u SENDCHANGE
作为标志值。不要忘记错误处理。如果
coInitializex()
返回一个失败
HRESULT
除了
RPC_E_CHANGED_模式
CoCreateInstance()
和其他COM调用也将失败。如果
CoInitializeEx()
失败,不要调用
CoInitializeEx()
返回一个失败
HRESULT
,存储在
desktop
变量中的地址不确定,无法使用。
HRESULT status=coinitializex(…);bool doUninit=succeed(status);if(doUninit | |(status==RPC|E|u CHANGED_MODE)){status=CoCreateInstance(…,&desktop);if(succeed(status)){…desktop->Release();}如果(doUninit)coninitialize();}
实际上,您的函数根本不应该调用
coinitializex()
coninitializex()
,那么调用线程有责任在自己的启动和清理过程中调用它们:
coinitializex(…);…SetWallpaper(…);…coninitialize()
我仍然有一个小问题“wooption.dwStyle=WPSTYLE_STRETCH;”没有效果,我的意思是,即使我修改这个参数,它也始终居中。你知道为什么吗?我刚刚看到了最后一部分你说的不确定是什么意思?
SetWallpaper(L"c:\\temp\\extracted.png");