using AudioWallpaper.Tools;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AudioWallpaper.OtherWallpaper {
public class ExecutableWallpaper {
public IntPtr Handle = IntPtr.Zero;
public IntPtr MainWindowHandle = IntPtr.Zero;
public String Url;
public Process WallpaperProcess;
private nint programIntPtr;
public ExecutableWallpaper(String url) {
this.Url = url;
}
public Process Start() {
WallpaperProcess = new Process();
WallpaperProcess.StartInfo = new ProcessStartInfo(Url);
WallpaperProcess.Start();
return WallpaperProcess;
}
public void ReShow(int x, int y, int w, int h) {
}
public IntPtr GetHandle() {
if (Handle == IntPtr.Zero) {
//获取Handle
if (WallpaperProcess == null) {
throw new NullReferenceException("WallpaperProcess Is Null Or Close");
}
Handle = WallpaperProcess.Handle;
Console.WriteLine(Handle);
} else {
return Handle;
}
return MainWindowHandle;
}
public IntPtr GetMainWindowHandle() {
if (MainWindowHandle == IntPtr.Zero) {
if (WallpaperProcess == null || WallpaperProcess.HasExited) {
throw new NullReferenceException("WallpaperProcess Is Null Or Close");
}
MainWindowHandle = WallpaperProcess.MainWindowHandle;
} else {
return MainWindowHandle;
}
Console.WriteLine(MainWindowHandle);
return MainWindowHandle;
}
public void SetShowPatternWallpaper() {
GetMainWindowHandle();
GetHandle();
Console.WriteLine("请输入句柄");
int temph = int.Parse(Console.ReadLine());
Console.WriteLine("..........");
Console.WriteLine(temph);
// 通过类名查找一个窗口,返回窗口句柄。
programIntPtr = Win32.FindWindow("Progman", null);
// 窗口句柄有效
if (programIntPtr != IntPtr.Zero) {
IntPtr result = IntPtr.Zero;
// 向 Program Manager 窗口发送 0x52c 的一个消息,超时设置为0x3e8(1秒)。
Win32.SendMessageTimeout(programIntPtr, 0x52c, IntPtr.Zero, IntPtr.Zero, 0, 0x3e8, result);
// 遍历顶级窗口
Win32.EnumWindows((hwnd, lParam) => {
// 找到包含 SHELLDLL_DefView 这个窗口句柄的 WorkerW
if (Win32.FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null) != IntPtr.Zero) {
// 找到当前 WorkerW 窗口的,后一个 WorkerW 窗口。
IntPtr tempHwnd = Win32.FindWindowEx(IntPtr.Zero, hwnd, "WorkerW", null);
// 隐藏这个窗口
Win32.ShowWindow(tempHwnd, 0);
}
return true;
}, IntPtr.Zero);
}
Win32.SetParent(temph, programIntPtr);//这里会触发DisplayChange事件,有点玄学
Win32.SetWindowPos(temph, IntPtr.Zero, 1920, 0, 1920, 1080, WindowPositionConstants.SWP_SHOWWINDOW);
}
///
/// 结束壁纸
///
/// true 结束成功 flase 结束失败
public bool Close() {
if (WallpaperProcess != null && !WallpaperProcess.HasExited) {
WallpaperProcess.Kill();
} else {
return true;
}
return WallpaperProcess.HasExited;
}
}
}