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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++使用ChangeParametersInfo更改桌面不起作用GetLastError返回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 :(");
}

我不知道为什么这不起作用,因为它没有返回错误代码(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");

这比打扰旧的更容易。仍然想知道为什么它没有给出错误。希望这会帮助别人。感谢大家的建议。

以上是关于C ++使用ChangeParametersInfo更改桌面不起作用GetLastError返回0的主要内容,如果未能解决你的问题,请参考以下文章

C/C++ ceil 函数

C/C++ floor 函数

开发环境Ubuntu 中使用 VSCode 开发 C/C++ ① ( 安装中文扩展 | 安装 C/C++ 扩展 )

使用隧道技术进行C&C通信

使用Notepad++编译运行C/C++/Python程序

C语言数组问题?