AdvancedBackgroundJimmy.Program.cs
using AdvancedBackground; using Microsoft.Win32; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.ServiceProcess; using System.Threading.Tasks; using System.Timers; namespace AdvancedBackgroundJimmy { [System.Runtime.Remoting.Contexts.Synchronization] static class Program { const int SPI_GETDESKWALLPAPER = 0x73; const int MAX_PATH = 260; const int SPI_SETDESKWALLPAPER = 0x14; const int SPIF_UPDATEINIFILE = 0x01; const int SPIF_SENDININICHANGE = 0x02; static string photoFileDirPath = @"g:/Photos/Camera/"; static DirectoryInfo photoDir = new DirectoryInfo(photoFileDirPath); static FileInfo[] photoFileArr = photoDir.GetFiles(); static int PHOTO_PER_WAIT = 3000; static string log_path = @"g:/TestLog/AdvancedBackgroundJimmy/log.txt"; static FileInfo logFileInfo = new FileInfo(log_path); static string log = null; /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { //ServiceBase[] servicesToRun = new ServiceBase[] //{ // new AdvancedBackgroundServiceJimmy() //}; //ServiceBase.Run(servicesToRun); AutoPhoto(); } public static void AutoPhoto() { try { log = "进入AutoPhoto方法!" + System.Environment.NewLine; File.AppendAllText(log_path, log); FileInfo[] fileArr = photoFileArr; for (int i = 0; i < fileArr.Length; i++) { FileInfo photoFile = fileArr[i]; log = "当前图片路径:" + photoFile.FullName + System.Environment.NewLine; File.AppendAllText(log_path, log); SetWallpaper2(photoFile.FullName, WallpaperStyle.Centered); //SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero); if (i == fileArr.Length - 1) { i = -1; } System.Threading.Thread.Sleep(PHOTO_PER_WAIT); } } catch(Exception e) { log = e.Message + System.Environment.NewLine; File.AppendAllText(log_path, log); } } const int WM_SETTINGCHANGE = 0x001A; const int HWND_BROADCAST = 0xffff; static IntPtr result1; public enum SendMessageTimeoutFlags : uint { SMTO_NORMAL = 0x0000, SMTO_BLOCK = 0x0001, SMTO_ABORTIFHUNG = 0x0002, SMTO_NOTIMEOUTIFNOTHUNG = 0x0008 } [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] static extern int GetLastError(); public enum WallpaperStyle : int { Tiled, Centered, Stretched, Fill, Fit } /// <summary> /// 返回当前的系统壁纸路径 /// </summary> /// <returns></returns> public static string GetDesktopWallpaper() { string wallpaper = new string(‘\0‘, MAX_PATH); try { int ret = SystemParametersInfo(SPI_GETDESKWALLPAPER, (int)wallpaper.Length, wallpaper, 0); } catch (Exception e) { log = e.Message + System.Environment.NewLine; File.AppendAllText(log_path, log); } return wallpaper.Substring(0, wallpaper.IndexOf(‘\0‘)); } [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr SendMessageTimeout( IntPtr windowHandle, uint Msg, IntPtr wParam, IntPtr lParam, SendMessageTimeoutFlags flags, uint timeout, out IntPtr result ); /// 桌面刷新 /// </summary> [DllImport("shell32.dll")] public static extern void SHChangeNotify(HChangeNotifyEventID wEventId, HChangeNotifyFlags uFlags, IntPtr dwItem1, IntPtr dwItem2); public static void DeskRef() { SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero); } #region [Flags] public enum HChangeNotifyFlags { SHCNF_DWORD = 0x0003, SHCNF_IDLIST = 0x0000, SHCNF_PATHA = 0x0001, SHCNF_PATHW = 0x0005, SHCNF_PRINTERA = 0x0002, SHCNF_PRINTERW = 0x0006, SHCNF_FLUSH = 0x1000, SHCNF_FLUSHNOWAIT = 0x2000 } #endregion #region enum HChangeNotifyEventID [Flags] public enum HChangeNotifyEventID { SHCNE_ALLEVENTS = 0x7FFFFFFF, SHCNE_ASSOCCHANGED = 0x08000000, SHCNE_ATTRIBUTES = 0x00000800, SHCNE_CREATE = 0x00000002, SHCNE_DELETE = 0x00000004, SHCNE_DRIVEADD = 0x00000100, SHCNE_DRIVEADDGUI = 0x00010000, SHCNE_DRIVEREMOVED = 0x00000080, SHCNE_EXTENDED_EVENT = 0x04000000, SHCNE_FREESPACE = 0x00040000, SHCNE_MEDIAINSERTED = 0x00000020, SHCNE_MEDIAREMOVED = 0x00000040, SHCNE_MKDIR = 0x00000008, SHCNE_NETSHARE = 0x00000200, SHCNE_NETUNSHARE = 0x00000400, SHCNE_RENAMEFOLDER = 0x00020000, SHCNE_RENAMEITEM = 0x00000001, SHCNE_RMDIR = 0x00000010, SHCNE_SERVERDISCONNECT = 0x00004000, SHCNE_UPDATEDIR = 0x00001000, SHCNE_UPDATEIMAGE = 0x00008000, } #endregion [DllImport("user32.dll")] public static extern bool InvalidateRect(IntPtr hwnd, IntPtr lpRect, bool bErase); public static void SetWallpaper2(string path, WallpaperStyle style) { try { log = "进入SetWallpaper方法!" + System.Environment.NewLine; File.AppendAllText(log_path, log); log = "时间:" + DateTime.Now.ToString() + System.Environment.NewLine; File.AppendAllText(log_path, log); //System.Drawing.Image img = System.Drawing.Image.FromStream(s); //string tempPath = Path.Combine(Path.GetTempPath(), "wallpaper.bmp"); //img.Save(tempPath, System.Drawing.Imaging.ImageFormat.Bmp); RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true); key.SetValue(@"Wallpaper", path); if (style == WallpaperStyle.Stretched) { key.SetValue(@"WallpaperStyle", 2.ToString()); key.SetValue(@"TileWallpaper", 0.ToString()); } else if (style == WallpaperStyle.Centered) { key.SetValue(@"WallpaperStyle", 1.ToString()); key.SetValue(@"TileWallpaper", 0.ToString()); } else if (style == WallpaperStyle.Tiled) { key.SetValue(@"WallpaperStyle", 1.ToString()); key.SetValue(@"TileWallpaper", 1.ToString()); } else if (style == WallpaperStyle.Fit) //Win 7 or later { key.SetValue(@"WallpaperStyle", 6.ToString()); key.SetValue(@"TileWallpaper", 0.ToString()); } else if (style == WallpaperStyle.Fill) //Win 7 or later { key.SetValue(@"WallpaperStyle", 10.ToString()); key.SetValue(@"TileWallpaper", 1.ToString()); } else { } int ret = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE | SPIF_SENDININICHANGE); if (ret > 0) { log = "结果:" + ret + System.Environment.NewLine; File.AppendAllText(log_path, log); } else { int errCode = GetLastError(); log = "错误码:" + errCode + System.Environment.NewLine; File.AppendAllText(log_path, log); } key.Flush(); key.Close(); //通知所有打开的程序注册表以修改 //SendMessageTimeout(new IntPtr(HWND_BROADCAST), WM_SETTINGCHANGE, IntPtr.Zero, IntPtr.Zero, SendMessageTimeoutFlags.SMTO_NORMAL, 1000, out result1); //DeskRef(); //InvalidateRect(IntPtr.Zero, IntPtr.Zero, true); } catch (Exception e) { log = e.Message + System.Environment.NewLine; File.AppendAllText(log_path, log); } } } }
ProjectInstaller.cs
using Microsoft.Win32; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Configuration.Install; using System.Linq; using System.Management; namespace AdvancedBackgroundJimmy { [RunInstaller(true)] public partial class ProjectInstaller : System.Configuration.Install.Installer { public ProjectInstaller() { InitializeComponent(); } protected override void OnCommitted(System.Collections.IDictionary savedState) { base.OnCommitted(savedState); //将服务更改为允许桌面交互模式 ConnectionOptions coOptions = new ConnectionOptions(); coOptions.Impersonation = ImpersonationLevel.Impersonate; ManagementScope mgmtScope = new System.Management.ManagementScope(@"root\CIMV2", coOptions); mgmtScope.Connect(); ManagementObject wmiService; wmiService = new ManagementObject("Win32_Service.Name=‘" + this.serviceInstaller1.ServiceName + "‘"); ManagementBaseObject InParam = wmiService.GetMethodParameters("Change"); InParam["DesktopInteract"] = true; ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null); } } }
AdvancedBackgroundServiceJimmy.cs
using AdvancedBackground; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.ServiceProcess; using System.Text; using System.Threading; using System.Windows.Forms; namespace AdvancedBackgroundJimmy { partial class AdvancedBackgroundServiceJimmy : ServiceBase { static String log_path = @"g:/TestLog/AdvancedBackgroundJimmy/log.txt"; static FileInfo logFileInfo = new FileInfo(log_path); static String log = null; static Thread thread = null; [DllImport("user32.dll")] static extern int GetDesktopWindow(); [DllImport("user32.dll")] static extern IntPtr GetProcessWindowStation(); [DllImport("kernel32.dll")] static extern IntPtr GetCurrentThreadId(); [DllImport("user32.dll")] static extern IntPtr GetThreadDesktop(IntPtr dwThread); [DllImport("user32.dll")] static extern IntPtr OpenWindowStation(string a, bool b, int c); [DllImport("user32.dll")] static extern IntPtr OpenDesktop(string lpszDesktop, uint dwFlags, bool fInherit, uint dwDesiredAccess); [DllImport("user32.dll")] static extern IntPtr CloseDesktop(IntPtr p); [DllImport("rpcrt4.dll", SetLastError = true)] static extern IntPtr RpcImpersonateClient(int i); [DllImport("rpcrt4.dll", SetLastError = true)] static extern IntPtr RpcRevertToSelf(); [DllImport("user32.dll")] static extern IntPtr SetThreadDesktop(IntPtr a); [DllImport("user32.dll")] static extern IntPtr SetProcessWindowStation(IntPtr a); [DllImport("user32.dll")] static extern IntPtr CloseWindowStation(IntPtr a); public AdvancedBackgroundServiceJimmy() { InitializeComponent(); if (!logFileInfo.Exists) { logFileInfo.CreateText(); } } protected override void OnStart(string[] args) { if (!logFileInfo.Exists) { logFileInfo.CreateText(); } log = "进入OnStart方法!" + System.Environment.NewLine; File.AppendAllText(log_path, log); ThreadStart threadStart = new ThreadStart(delegate() { try { if (!logFileInfo.Exists) { logFileInfo.CreateText(); } GetDesktopWindow(); IntPtr hwinstaSave = GetProcessWindowStation(); IntPtr dwThreadId = GetCurrentThreadId(); IntPtr hdeskSave = GetThreadDesktop(dwThreadId); IntPtr hwinstaUser = OpenWindowStation("WinSta0", false, 33554432); if (hwinstaUser == IntPtr.Zero) { RpcRevertToSelf(); return; } SetProcessWindowStation(hwinstaUser); IntPtr hdeskUser = OpenDesktop("Default", 0, false, 33554432); RpcRevertToSelf(); if (hdeskUser == IntPtr.Zero) { SetProcessWindowStation(hwinstaSave); CloseWindowStation(hwinstaUser); return; } SetThreadDesktop(hdeskUser); IntPtr dwGuiThreadId = dwThreadId; AdvancedBackgroundJimmy.Program.AutoPhoto(); dwGuiThreadId = IntPtr.Zero; SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); CloseDesktop(hdeskUser); CloseWindowStation(hwinstaUser); } catch (Exception e) { log = e.Message + System.Environment.NewLine; File.AppendAllText(log_path, log); } }); thread = new Thread(threadStart); thread.IsBackground = true; thread.Start(); //AdvancedBackgroundJimmy.Program.AutoPhoto(); } protected override void OnStop() { if(thread != null) { if (thread.IsAlive) { thread.Abort(); thread = null; } } } } }
完成.
原文地址:https://www.cnblogs.com/JimmySeraph/p/11696303.html
时间: 2024-11-02 10:12:32