C++ 使用 ChangeParametersInfo 更改桌面不起作用 GetLastError returns 0
C++ Change the desktop with ChangeParametersInfo not working GetLastError returns 0
我正在尝试使用以下代码更改 Windows 7 机器上的墙纸。我正在使用多字节字符集进行编译。
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 :(");
}
我不知道为什么这不起作用,因为它没有 return 错误代码(GetLastError 给出 0)。墙纸不变就不用说了
编辑:试图更改为此并放置一个 bmp 文件。
int error(0);
if(SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, L"c:\temp\extracted.bmp", SPIF_SENDCHANGE) != 0)
{
std::cout << "Success !" << std::endl;
}
else
{
error = GetLastError();
std::cout << "Failure :(" << std::endl;
std::cout << "Error: " << error << std::endl;
system("title :(");
}
system("pause");
控制台中的输出是失败 :( 后跟错误:0
根据评论的建议,我放弃了 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");
这比麻烦旧的要容易得多。仍然想知道为什么它没有给出错误。希望这会帮助别人。
谢谢大家的指点。
我正在尝试使用以下代码更改 Windows 7 机器上的墙纸。我正在使用多字节字符集进行编译。
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 :(");
}
我不知道为什么这不起作用,因为它没有 return 错误代码(GetLastError 给出 0)。墙纸不变就不用说了
编辑:试图更改为此并放置一个 bmp 文件。
int error(0);
if(SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, L"c:\temp\extracted.bmp", SPIF_SENDCHANGE) != 0)
{
std::cout << "Success !" << std::endl;
}
else
{
error = GetLastError();
std::cout << "Failure :(" << std::endl;
std::cout << "Error: " << error << std::endl;
system("title :(");
}
system("pause");
控制台中的输出是失败 :( 后跟错误:0
根据评论的建议,我放弃了 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");
这比麻烦旧的要容易得多。仍然想知道为什么它没有给出错误。希望这会帮助别人。 谢谢大家的指点。