javagroovy

Can I change my Windows desktop wallpaper programmatically in Java/Groovy?


Is there a way I can use Java (or Groovy) to change my desktop wallpaper in Windows XP? I have a program that creates a new image every day (or whenever) and I would like a way to automatically update my desktop.

I've seem some questions on this site about C++ or .NET, but I did not see anything specific to Java.


Solution

  • Sorry I'm a bit behind @ataylor's answer because I was preparing a snippet to do it. Yes, JNA is a correct approach. Here you go:

    import java.util.HashMap;
    
    import com.sun.jna.Native;
    import com.sun.jna.platform.win32.WinDef.UINT_PTR;
    import com.sun.jna.win32.*;
    
    public class WallpaperChanger {
       public static void main(String[] args) {
          //supply your own path instead of using this one
          String path = "C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg";
    
          SPI.INSTANCE.SystemParametersInfo(
              new UINT_PTR(SPI.SPI_SETDESKWALLPAPER), 
              new UINT_PTR(0), 
              path, 
              new UINT_PTR(SPI.SPIF_UPDATEINIFILE | SPI.SPIF_SENDWININICHANGE));
       }
    
       public interface SPI extends StdCallLibrary {
    
          //from MSDN article
          long SPI_SETDESKWALLPAPER = 20;
          long SPIF_UPDATEINIFILE = 0x01;
          long SPIF_SENDWININICHANGE = 0x02;
    
          SPI INSTANCE = (SPI) Native.loadLibrary("user32", SPI.class, new HashMap<Object, Object>() {
             {
                put(OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE);
                put(OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE);
             }
          });
    
          boolean SystemParametersInfo(
              UINT_PTR uiAction,
              UINT_PTR uiParam,
              String pvParam,
              UINT_PTR fWinIni
            );
      }
    }
    

    You need to have the JNA libraries on the classpath for this to work. This was tested in Windows 7, there might be some nuances in XP but I think it should work. That API is presumably stable.

    References

    Edit (2010/01/20):

    I had previously omitted the options SPIF_UPDATEINIFILE and SPIF_SENDWININICHANGE. These are now being used as they were suggested in the Coding4Fun MSDN article.