2012-08-31 123 views
7

要创建定期更改桌面壁纸的程序,最佳方法是什么?我还想在程序周围创建一个GUI。我是一名计算机科学专业的学生,​​因此我掌握Java和C++等基础编程。这将在Windows 7操作系统上完成。以编程方式定期更改桌面壁纸

什么是最好的语言用于这样的项目?

理想情况下,我想用系统时钟触发更改。这可能吗?

我在我的头上吗?

任何答案将非常感激。谢谢。

+0

您对这个项目的尽职调查结果是什么?你目前正在进行的哪些调查显示给你? –

+1

你肯定不会在没有JNI调用的情况下用java做到这一点,但C++可能 – axl

+0

我已经看到很多使用各种语言的类似项目的解决方案。我已经看过SystemParametersInfo,它似乎必须被合并。我没有看到任何有关使用系统时钟或使用GUI的信息。 –

回答

9

这是一个相当简单的项目,可以使用任何可以调用Win32 API函数(例如C++)的语言轻松完成。用于更改壁纸的非显而易见的功能是SystemParametersInfoSPI_SETDESKWALLPAPER标志。您给它一个新图像的文件名称,并更改壁纸。

+1

好的,这是一个相当简单的项目,所有的信心真的很有帮助,并给了我开始这个项目的信心。似乎我所有的问题都得到了回答,现在我开始了。谢谢大家。 –

+0

不客气。如果您还有其他问题,请随时提问(请记住,Stack Overflow最适合特定问题)。 –

15

在Java:

import java.util.*; 

public class changer 
{ 
    public static native int SystemParametersInfo(int uiAction,int uiParam,String pvParam,int fWinIni); 

    static 
    { 
     System.loadLibrary("user32"); 
    } 

    public int Change(String path) 
    { 
     return SystemParametersInfo(20, 0, path, 0); 
    } 

    public static void main(String args[]) 
    { 
     String wallpaper_file = "c:\\wallpaper.jpg"; 
     changer mychanger = new changer(); 
     mychanger.Change(wallpaper_file); 
    } 

} 

在Win32 C++中,你可以使用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; 
} 
+0

什么应该在mac os中写入id x。它无法加载user32库。 – saman