7
votes

Changer le papier peint Programmatiquement à l'aide de C ++ et Windows API

J'essaie d'écrire une application, d'utiliser qt et mingw32, pour télécharger des images et les définir comme fond d'écran de fond. J'ai lu plusieurs articles en ligne sur la façon de faire cela, dans VB et C #, et dans une certaine mesure à le faire en C ++. J'appelle actuellement le SystemParametersinfo code> avec ce qui semble être tous les arguments corrects (aucune erreur de compilateur) et échoue. Aucun grand accident de cymbales, juste un 0 code> est retourné. getlasterror () code> renvoie un 0 code> 0 code>.

ci-dessous est le code que j'utilise (sous un formulaire légèrement modifié, vous n'avez donc pas à afficher les internes de l'objet ). P>

#include <windows.h>
#include <iostream>
#include <QString>

void setWall()
{
    QString filepath = "C:\\Documents and Settings\\Owner\\My Documents\\Wallpapers\\wallpaper.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;
    }
}


1 commentaires

L'avez-vous essayé avec un fichier bitmap et non PNG / JPG?


3 Réponses :


2
votes
"C:\\Documents and Settings\\Owner\\My Documents\\Wallpapers\\wallpaper.png";

1 commentaires

Oh c'est vrai. Mais ce n'est pas l'erreur. Dans le programme actuel, le qstring est correctement peuplé par une fonction différente :) mais des félicitations pour avoir repéré mon erreur :)



9
votes

Cela pourrait être que systemparametersinfo code> s'attend à un lpwstr code> (un pointeur sur wchar_t code>).

Essayez ceci: P>

LPWSTR test = L"C:\\Documents and Settings\\Owner\\My Documents\\Wallpapers\\wallpaper.png";

result = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, test, SPIF_UPDATEINIFILE);


0 commentaires

-1
votes

Vous pouvez utiliser Définir la minuterie code> pour déclencher une modification.

#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;
}


0 commentaires