2010-07-26 17 views
6

Görüntüleri indirmek ve arka plan Duvar Kağıdı olarak ayarlamak için Qt ve mingw32 kullanarak bir uygulama yazmaya çalışıyorum. VB ve C# 'da nasıl yapılacağı ve C++' da nasıl yapılacağı hakkında birkaç makaleyi okudum. Şu anda SystemParametersInfo'u tüm doğru argümanlar (derleyici hataları yok) gibi görünüyor ve başarısız oluyor. Zillerin büyük çarpması yok, sadece 0 döndü. GetLastError(), eşit derecede aydınlatıcı bir 0 döndürür.Duvar kağıdını program aracılığıyla C++ ve windows api kullanarak değiştirme

Kullandığım kod aşağıdadır (Biraz değiştirilmiş bir formda, böylece nesnenin içeriklerini görmeniz gerekmez).

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

png/jpg değil, bir bitmap dosyasıyla denediniz mi? –

+0

png, jpeg, bmp ile çalıştı. –

cevap

10

O SystemParametersInfo (wchar_t bir işaretçi) bir LPWSTR bekliyor olması olabilir.

bu deneyin:

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

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

bu (sadece emin olmak için birkaç farklı dosyalar ile deneyin) işleri varsa, senin char * bir LPWSTR dönüştürmek gerekir. Qt'nin bu hizmetleri sunup sunmadığından emin değilim, ancak yardımcı olabilecek bir işlev MultiByteToWideChar.

+1

Evet bir çalışır - Sadece denedim ... – sukru

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

bu olmamalı:

"C:\\Documents and Settings\\Owner\\My Documents\\Wallpapers\\wallpaper.png"; 
+0

Oh doğru. Ama bu bir hata değil. Gerçek programda, QString düzgün bir şekilde farklı bir fonksiyon tarafından doldurulur :) Ama benim hata tespit için kudos :) –

0

Değişiklik yapmak için SetTimer'u kullanın.

#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; 
} 
İlgili konular