Puis-je changer mon fond d'écran Windows par programme en Java/Groovy?


Existe-t-il un moyen d'utiliser Java (ou Groovy) pour changer mon fond d'écran dans Windows XP? J'ai un programme qui crée une nouvelle image tous les jours (ou chaque fois) et je voudrais un moyen de mettre à jour automatiquement mon bureau.

Il me semble que j'ai quelques questions sur ce site sur C++ ou.NET, mais je n'ai rien vu de spécifique à Java.

Author: Matt N, 2011-01-20

4 answers

Désolé, je suis un peu en retard sur la réponse de @ataylor parce que je préparais un extrait pour le faire. Oui, JNA est une approche correcte. Ici, vous allez:

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

Vous devez avoir les bibliothèques JNA sur le chemin de classe pour que cela fonctionne. Cela a été testé dans Windows 7, il pourrait y avoir quelques nuances dans XP mais je pense que cela devrait fonctionner. Cette API est vraisemblablement stable.

Références

Modifier (2010/01/20):

Auparavant, j'avais omis les options SPIF_UPDATEINIFILE et SPIF_SENDWININICHANGE. Ceux-ci sont maintenant utilisés comme ils ont été suggérés dans l'article Coding4Fun MSDN.

 24
Author: Mark Peters, 2017-05-23 12:34:18

Vous pouvez le faire plus facilement:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.PVOID;
import com.sun.jna.win32.W32APIOptions;
public class Wallpaper {    
 public static interface User32 extends Library {
     User32 INSTANCE = (User32) Native.loadLibrary("user32",User32.class,W32APIOptions.DEFAULT_OPTIONS);        
     boolean SystemParametersInfo (int one, int two, String s ,int three);         
 }
public static void main(String[] args) {   
   User32.INSTANCE.SystemParametersInfo(0x0014, 0, "C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg" , 1);
   }
 }
 5
Author: Andrey, 2014-04-02 18:18:07

Vous pouvez écrire un fichier batch pour changer le papier peint , et exécuter ce fichier batch en utilisant,

Runtime.getRuntime.exec()

 3
Author: Eternal Noob, 2011-01-20 17:57:29

La bibliothèque java JNA vous permet d'appeler facilement les appels d'API Win32. En particulier, pour modifier l'arrière-plan du bureau, vous devez appeler la fonction SystemParametersInfo .

Jetez un oeil à cet article pour une introduction à la JNA: http://today.java.net/article/2009/11/11/simplify-native-code-access-jna

 2
Author: ataylor, 2011-01-20 17:52:04