2010-07-26 6 views
6

Qt 및 mingw32를 사용하여 이미지를 다운로드하고 배경 화면으로 설정하는 응용 프로그램을 작성하려고했습니다. VB와 C#에서이 작업을 수행하는 방법과 C++에서 수행하는 방법에 대한 온라인 기사를 여러 권 읽었습니다. 나는 현재 올바른 인수 (컴파일러 오류가없는 것)가있는 것으로 보이는 SystemParametersInfo을 호출하고 실패합니다. 심벌즈의 큰 충돌은없고, 단지 0가 반환되었습니다. GetLastError()은 똑같이 계몽 된 0을 반환합니다.C++ 및 windows api를 사용하여 프로그래밍 방식으로 배경 화면 변경

다음은 사용중인 코드입니다 (약간 수정 된 양식이므로 내부 개체를 볼 필요가 없습니다).

#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가 아닌 비트 맵 파일로 해 보았습니까? –

+0

png, jpeg, bmp로 시도했습니다. –

답변

10

그것은 SystemParametersInfo은 (wchar_t에 대한 포인터)를 LPWSTR를 기대하고 있다고 할 수있다.

이 시도 :

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입니다.

+1

네가 작동합니다 - 방금 시도했습니다 ... – sukru

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

이 안 :

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

오 사실. 그러나 그것은 오류가 아닙니다. 실제 프로그램에서 QString은 다른 함수로 적절히 채워져 있습니다. :) 그러나 내 실수를 찾아 내기위한 명성 :) –

0

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