C ++ Изменить рабочий стол с ChangeParametersInfo не работает GetLastError возвращает 0 - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь использовать следующий код, чтобы изменить обои на компьютере с 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

1 Ответ

0 голосов
/ 08 ноября 2018

По совету в комментариях я отказался от 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");

Это намного проще, чем возиться со старым. Все еще задаюсь вопросом, почему это не дает ошибку. Надеюсь, это поможет кому-то еще. Спасибо всем за советы.

...