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

时间:2018-11-07 23:17:53

标签: c++ winapi desktop

我正在尝试使用以下代码在Windows 7计算机上更换墙纸。我正在使用多字节字符集进行编译。

'use strict';

const base = process.env.PWD,
      client = require(base + '/db.js'),
      assert = require('assert')

let db

const getTodos = async (req, res) => {
  db = await client.connect()
  const collection = await db.collection('documents')
  // Find all todos
  collection.find({}).toArray((err, todos) => {
    assert.equal(err, null)
    res.status(200).json(todos)
  })
  client.disconnect()
}

我不知道为什么它不起作用,因为它没有返回错误代码(GetLastError给出0)。不用说墙纸保持不变。

编辑:尝试更改为此内容并放入bmp文件。

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 :(");
}

控制台中的输出为失败:(后跟错误:0

1 个答案:

答案 0 :(得分: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");

这比困扰旧版本要容易得多。仍然想知道为什么它没有给出错误。希望这会帮助别人。 谢谢大家的建议。