Изменение обоев программно с помощью C++ и Windows api
Я пытаюсь написать приложение, используя Qt и mingw32, чтобы загрузить изображения и установить их в качестве фона обоев. Я прочитал несколько статей в интернете о том, как это сделать, в VB и C#, и в некоторой степени, как это сделать на C++. В настоящее время я вызываю SystemParametersInfo с тем, что кажется всеми правильными аргументами (без ошибок компилятора), и это не удается. Никакого грохота тарелок, только "а"!--2--> вернулся. GetLastError() возвращает столь же поучительный 0.
ниже код, который я использую (в слегка измененной форме, поэтому вам не нужно просматривать внутренние объекты).
#include <windows.h>
#include <iostream>
#include <QString>
void setWall()
{
    QString filepath = "C:Documents and SettingsOwnerMy DocumentsWallpaperswallpaper.png";
    char path[150];
    strcpy(path, currentFilePath.toStdString().c_str());
    char *pathp;
    pathp = path;
    cout << path;
    int result;
    result = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pathp, SPIF_UPDATEINIFILE);
    if (result)
    {
        cout << "Wallpaper set";
    }
    else
    {
        cout << "Wallpaper not set";
        cout << "SPI returned" << result;
    }
}
3 ответов
может быть,SystemParametersInfo ждет LPWSTR (указатель на wchar_t).
попробуйте это:
LPWSTR test = L"C:\Documents and Settings\Owner\My Documents\Wallpapers\wallpaper.png";
result = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, test, SPIF_UPDATEINIFILE);
если это работает (попробуйте с несколькими разными файлами, чтобы убедиться), вам нужно будет конвертировать ваш char * до LPWSTR. Я не уверен, что Qt предоставляет эти услуги, но одна функция, которая может помочь MultiByteToWideChar.
"C:\Documents and Settings\Owner\My Documents\Wallpapers\wallpaper.png";
не должно быть:
"C:\Documents and Settings\Owner\My Documents\Wallpapers\wallpaper.png";
вы cn использовать SetTimer, чтобы вызвать изменение.
#define STRICT 1 
#include <windows.h>
#include <iostream.h>
VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) 
{
  LPWSTR wallpaper_file = L"C:\Wallpapers\wallpaper.png";
  int return_value = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, wallpaper_file, SPIF_UPDATEINIFILE);
  cout << "Programmatically change the desktop wallpaper periodically: " << dwTime << '\n';
  cout.flush();
}
int main(int argc, char *argv[], char *envp[]) 
{
    int Counter=0;
    MSG Msg;
    UINT TimerId = SetTimer(NULL, 0, 2000, &TimerProc); //2000 milliseconds
    cout << "TimerId: " << TimerId << '\n';
   if (!TimerId)
    return 16;
   while (GetMessage(&Msg, NULL, 0, 0)) 
   {
        ++Counter;
        if (Msg.message == WM_TIMER)
        cout << "Counter: " << Counter << "; timer message\n";
        else
        cout << "Counter: " << Counter << "; message: " << Msg.message << '\n';
        DispatchMessage(&Msg);
    }
   KillTimer(NULL, TimerId);
return 0;
}
