Могу ли я программно изменить обои для рабочего стола Windows на Java / Groovy? - PullRequest
13 голосов
/ 20 января 2011

Можно ли использовать Java (или Groovy) для изменения обоев рабочего стола в Windows XP?У меня есть программа, которая создает новое изображение каждый день (или когда-либо), и я хотел бы, чтобы я автоматически обновлял свой рабочий стол.

Мне кажется, на этом сайте есть некоторые вопросы о C ++ или .NET, но яне видел ничего специфического для Java.

Ответы [ 4 ]

25 голосов
/ 20 января 2011

Извините, я немного позади ответа @ ataylor, потому что я готовил фрагмент для этого.Да, JNA - это правильный подход.Вот, пожалуйста:

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

Вам нужно иметь библиотеки JNA на пути к классам, чтобы это работало.Это было проверено в Windows 7, в XP могут быть некоторые нюансы, но я думаю, что это должно работать.Этот API предположительно стабилен.

Ссылки

Редактировать (2010/01/20):

Ранее я не указывал параметрыSPIF_UPDATEINIFILE и SPIF_SENDWININICHANGE.Теперь они используются так, как они были предложены в статье Coding4Fun MSDN.

5 голосов
/ 02 апреля 2014

Вы можете сделать это проще:

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);
   }
 }
3 голосов
/ 20 января 2011

Вы можете написать пакетный файл для изменения обоев и выполнить этот пакетный файл, используя

Runtime.getRuntime.exec()

2 голосов
/ 20 января 2011

Java-библиотека JNA позволяет легко вызывать вызовы Win32 API.В частности, чтобы изменить фон рабочего стола, вам нужно вызвать функцию SystemParametersInfo .

Ознакомьтесь с этой статьей для ознакомления с JNA: http://today.java.net/article/2009/11/11/simplify-native-code-access-jna

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...