**有一天,我突发奇想,想用java写一个可以实现动态壁纸功能的程序,所以我就花了2天时间写了一个
**
maven依赖
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>17-ea+11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>17-ea+11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-media</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.8.0</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-web</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.8.0</version> <!-- Check for the latest version -->
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.8.0</version> <!-- Check for the latest version -->
</dependency>
</dependencies>
然后用javafx播放视频(最好全屏)(不知道为啥我这里javafx显示不了4k视频)
java.io.File file = new java.io.File(“动态壁纸的路径”);
String url = file.toURI().toString();
Media media = new Media(url);
mediaPlayer = new MediaPlayer(media);
mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);
mediaPlayer.setAutoPlay(true); //设置自动播放
MediaView mediaView = new MediaView(mediaPlayer);
mediaView.setPreserveRatio(true);
Rectangle2D screenRectangle = Screen.getPrimary().getBounds();
mediaView.setFitWidth(screenRectangle.getWidth());
mediaView.setFitHeight(screenRectangle.getHeight());
pane.getChildren().add(mediaView);
Scene scene = new Scene(pane, screenRectangle.getWidth(), screenRectangle.getHeight());
stage.setFullScreen(true);
stage.setTitle("setAsCamwallpaperce84aa7d-3cec-4ef8-b6fd-b3d76e56aa20");//这里设置一个题目
然后javafx写好了,在将0x052C指令发送给桌面,这样就可以使图标与壁纸分离,再把原来壁纸给隐藏掉,然后将我们刚刚写的窗口设成壁纸。(网上讲解很多,不仔细讲)
public class DynamicWallpaper {
public static WinDef.HWND hide=null;
public interface User32 extends StdCallLibrary {
User32 INSTANCE = Native.load("user32", User32.class, W32APIOptions.DEFAULT_OPTIONS);
WinDef.HWND FindWindow(String lpClassName, String lpWindowName);
int SendMessage(WinDef.HWND hWnd, int msg, int wParam, int lParam);
boolean EnumWindows(WinUser.WNDENUMPROC lpEnumFunc, Pointer data);
WinDef.HWND FindWindowEx(WinDef.HWND hWndParent, WinDef.HWND hWndChildAfter, String lpClassName, String lpWindowName);
boolean ShowWindow(WinDef.HWND hWnd, int nCmdShow);
WinDef.HWND SetParent(WinDef.HWND hWndChild, WinDef.HWND hWndNewParent);
}
public static void main(String[] args) {
User32 user32 = User32.INSTANCE;
WinDef.HWND windowHandle = user32.FindWindow("Progman", null);
user32.SendMessage(windowHandle, 0x052C, 0, 0);
user32.EnumWindows((hWnd, data) -> {
WinDef.HWND defview = user32.FindWindowEx(hWnd, null, "SHELLDLL_DefView", null);
if (defview != null) {
hide = user32.FindWindowEx(null, hWnd, "WorkerW", null);
}
return true;
}, null);
user32.ShowWindow(hide, 0);
WinDef.HWND hwnd = user32.FindWindow(null, "setAsCamwallpaperce84aa7d-3cec-4ef8-b6fd-b3d76e56aa20");
user32.SetParent(hwnd,windowHandle);
}
}
然后就完成所需的功能了。
