C++ C++;使用ChangeParametersInfo更改桌面不工作GetLastError返回0
我正在尝试使用以下代码更改Windows7计算机上的墙纸。我用多字节字符集编译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 :(" <<
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");