win7自动壁纸切换小工具AutoDesk二:fade effect的壁纸切换

要实现壁纸切换,可以用函数WinAPI.SystemParametersInfo(20, 1, strSavePath, 1)来实现。

strSavePath为图片的位置,实际测下来该函数并不要求图片一定是bmp格式,jpg|png也都可以的。

函数的原型声明如下:

1 class WinAPI
2     {
3         
4         [DllImport("user32.dll", CharSet=CharSet.Auto)]
5         public static  extern int SystemParametersInfo (int uAction , int uParam , string lpvParam , int fuWinIni);
6     }

该函数的问题就是没有fade效果,只直接换壁纸,非常的突兀。要实现fade效果需要活动桌面,即接口IActiveDesktop.

msdn的介绍说是:

Allows a client program to manage the desktop items and wallpaper on a local computer。

设计到COM编程。下面是IActiveDesktop的c#的实现。

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Runtime.InteropServices;
  6 
  7 namespace AutoDesk
  8 {
  9         public struct WALLPAPEROPT
 10         {
 11             public static readonly int SizeOf = Marshal.SizeOf(typeof(WALLPAPEROPT));
 12         }
 13 
 14         public enum WallPaperStyle : int
 15         {
 16             WPSTYLE_CENTER = 0,
 17             WPSTYLE_TILE = 1,
 18             WPSTYLE_STRETCH = 2,
 19             WPSTYLE_MAX = 3
 20         }
 21 
 22         [Flags]
 23         public enum AD_Apply : int
 24         {
 25             SAVE = 0x00000001,
 26             HTMLGEN = 0x00000002,
 27             REFRESH = 0x00000004,
 28             ALL = SAVE | HTMLGEN | REFRESH,
 29             FORCE = 0x00000008,
 30             BUFFERED_REFRESH = 0x00000010,
 31             DYNAMICREFRESH = 0x00000020
 32         }
 33 
 34         [StructLayout(LayoutKind.Sequential)]
 35         public struct COMPONENTSOPT
 36         {
 37             public static readonly int SizeOf = Marshal.SizeOf(typeof(COMPONENTSOPT));
 38             public int dwSize;
 39             [MarshalAs(UnmanagedType.Bool)]
 40             public bool fEnableComponents;
 41             [MarshalAs(UnmanagedType.Bool)]
 42             public bool fActiveDesktop;
 43         }
 44 
 45         [Flags]
 46         public enum CompItemState : int
 47         {
 48             NORMAL = 0x00000001,
 49             FULLSCREEN = 00000002,
 50             SPLIT = 0x00000004,
 51             VALIDSIZESTATEBITS = NORMAL | SPLIT | FULLSCREEN,
 52             VALIDSTATEBITS = NORMAL | SPLIT | FULLSCREEN | unchecked((int)0x80000000) | 0x40000000
 53         }
 54 
 55         [StructLayout(LayoutKind.Sequential)]
 56         public struct COMPSTATEINFO
 57         {
 58             public static readonly int SizeOf = Marshal.SizeOf(typeof(COMPSTATEINFO));
 59             public int dwSize;
 60             public int iLeft;
 61             public int iTop;
 62             public int dwWidth;
 63             public int dwHeight;
 64             public CompItemState dwItemState;
 65         }
 66 
 67         [StructLayout(LayoutKind.Sequential)]
 68         public struct COMPPOS
 69         {
 70             public const int COMPONENT_TOP = 0x3FFFFFFF;
 71             public const int COMPONENT_DEFAULT_LEFT = 0xFFFF;
 72             public const int COMPONENT_DEFAULT_TOP = 0xFFFF;
 73             public static readonly int SizeOf = Marshal.SizeOf(typeof(COMPPOS));
 74 
 75             public int dwSize;
 76             public int iLeft;
 77             public int iTop;
 78             public int dwWidth;
 79             public int dwHeight;
 80             public int izIndex;
 81             [MarshalAs(UnmanagedType.Bool)]
 82             public bool fCanResize;
 83             [MarshalAs(UnmanagedType.Bool)]
 84             public bool fCanResizeX;
 85             [MarshalAs(UnmanagedType.Bool)]
 86             public bool fCanResizeY;
 87             public int iPreferredLeftPercent;
 88             public int iPreferredTopPercent;
 89         }
 90 
 91         public enum CompType : int
 92         {
 93             HTMLDOC = 0,
 94             PICTURE = 1,
 95             WEBSITE = 2,
 96             CONTROL = 3,
 97             CFHTML = 4
 98         }
 99 
100         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)]
101         public struct COMPONENT
102         {
103             private const int INTERNET_MAX_URL_LENGTH = 2084; // = INTERNET_MAX_SCHEME_LENGTH (32) + "://\0".Length +   INTERNET_MAX_PATH_LENGTH (2048)
104             public static readonly int SizeOf = Marshal.SizeOf(typeof(COMPONENT));
105 
106             public int dwSize;
107             public int dwID;
108             public CompType iComponentType;
109             [MarshalAs(UnmanagedType.Bool)]
110             public bool fChecked;
111             [MarshalAs(UnmanagedType.Bool)]
112             public bool fDirty;
113             [MarshalAs(UnmanagedType.Bool)]
114             public bool fNoScroll;
115             public COMPPOS cpPos;
116             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
117             public string wszFriendlyName;
118             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = INTERNET_MAX_URL_LENGTH)]
119             public string wszSource;
120             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = INTERNET_MAX_URL_LENGTH)]
121             public string wszSubscribedURL;
122 
123             public int dwCurItemState;
124             public COMPSTATEINFO csiOriginal;
125             public COMPSTATEINFO csiRestored;
126         }
127 
128         public enum DtiAddUI : int
129         {
130             DEFAULT = 0x00000000,
131             DISPSUBWIZARD = 0x00000001,
132             POSITIONITEM = 0x00000002,
133         }
134 
135         [Flags]
136         public enum ComponentModify : int
137         {
138             TYPE = 0x00000001,
139             CHECKED = 0x00000002,
140             DIRTY = 0x00000004,
141             NOSCROLL = 0x00000008,
142             POS_LEFT = 0x00000010,
143             POS_TOP = 0x00000020,
144             SIZE_WIDTH = 0x00000040,
145             SIZE_HEIGHT = 0x00000080,
146             POS_ZINDEX = 0x00000100,
147             SOURCE = 0x00000200,
148             FRIENDLYNAME = 0x00000400,
149             SUBSCRIBEDURL = 0x00000800,
150             ORIGINAL_CSI = 0x00001000,
151             RESTORED_CSI = 0x00002000,
152             CURITEMSTATE = 0x00004000,
153             ALL = TYPE | CHECKED | DIRTY | NOSCROLL | POS_LEFT | SIZE_WIDTH |
154                 SIZE_HEIGHT | POS_ZINDEX | SOURCE |
155                 FRIENDLYNAME | POS_TOP | SUBSCRIBEDURL | ORIGINAL_CSI |
156                 RESTORED_CSI | CURITEMSTATE
157         }
158 
159         [Flags]
160         public enum AddURL : int
161         {
162             SILENT = 0x0001
163         }
164 
165         [ComImport]
166         [Guid("F490EB00-1240-11D1-9888-006097DEACF9")]
167         [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
168         public interface IActiveDesktop
169         {
170             [PreserveSig]
171             int ApplyChanges(AD_Apply dwFlags);
172             [PreserveSig]
173             int GetWallpaper([MarshalAs(UnmanagedType.LPWStr)]  System.Text.StringBuilder pwszWallpaper,
174                 int cchWallpaper,
175                 int dwReserved);
176             [PreserveSig]
177             int SetWallpaper([MarshalAs(UnmanagedType.LPWStr)] string pwszWallpaper, int dwReserved);
178             [PreserveSig]
179             int GetWallpaperOptions(ref WALLPAPEROPT pwpo, int dwReserved);
180             [PreserveSig]
181             int SetWallpaperOptions(ref WALLPAPEROPT pwpo, int dwReserved);
182             [PreserveSig]
183             int GetPattern([MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder pwszPattern, int cchPattern, int dwReserved);
184             [PreserveSig]
185             int SetPattern([MarshalAs(UnmanagedType.LPWStr)] string pwszPattern, int dwReserved);
186             [PreserveSig]
187             int GetDesktopItemOptions(ref COMPONENTSOPT pco, int dwReserved);
188             [PreserveSig]
189             int SetDesktopItemOptions(ref COMPONENTSOPT pco, int dwReserved);
190             [PreserveSig]
191             int AddDesktopItem(ref COMPONENT pcomp, int dwReserved);
192             [PreserveSig]
193             int AddDesktopItemWithUI(IntPtr hwnd, ref COMPONENT pcomp, DtiAddUI dwFlags);
194             [PreserveSig]
195             int ModifyDesktopItem(ref COMPONENT pcomp, ComponentModify dwFlags);
196             [PreserveSig]
197             int RemoveDesktopItem(ref COMPONENT pcomp, int dwReserved);
198             [PreserveSig]
199             int GetDesktopItemCount(out int lpiCount, int dwReserved);
200             [PreserveSig]
201             int GetDesktopItem(int nComponent, ref COMPONENT pcomp, int dwReserved);
202             [PreserveSig]
203             int GetDesktopItemByID(IntPtr dwID, ref COMPONENT pcomp, int dwReserved);
204             [PreserveSig]
205             int GenerateDesktopItemHtml([MarshalAs(UnmanagedType.LPWStr)] string pwszFileName, ref COMPONENT pcomp, int dwReserved);
206             [PreserveSig]
207             int AddUrl(IntPtr hwnd, [MarshalAs(UnmanagedType.LPWStr)] string pszSource, ref COMPONENT pcomp, AddURL dwFlags);
208             [PreserveSig]
209             int GetDesktopItemBySource([MarshalAs(UnmanagedType.LPWStr)] string pwszSource, ref COMPONENT pcomp, int dwReserved);
210 
211         }
212 
213         /// <summary>
214         /// Summary description for shlobj.
215         /// Written by: Eber Irigoyen
216         /// on: 11/23/2005
217         /// </summary>
218         public class shlobj
219         {
220             public static readonly Guid CLSID_ActiveDesktop =
221                 new Guid("{75048700-EF1F-11D0-9888-006097DEACF9}");
222 
223             public static IActiveDesktop GetActiveDesktop()
224             {
225                 Type typeActiveDesktop = Type.GetTypeFromCLSID(shlobj.CLSID_ActiveDesktop);
226                 return (IActiveDesktop)Activator.CreateInstance(typeActiveDesktop);
227             }
228 
229             public shlobj()
230             {
231                 //
232                 // TODO: Add constructor logic here
233                 //
234             }
235         }
236     
237 }

其使用方法如前面的函数

1 private void switch_to_next_waller()
2         {
3             string strSavePath = Path.Combine(m_deskpick_path, get_random_pick_name());
4             //WinAPI.SystemParametersInfo(20, 1, strSavePath, 1);
5             IActiveDesktop iad = shlobj.GetActiveDesktop();
6             iad.SetWallpaper(strSavePath, 0);
7             iad.ApplyChanges(AD_Apply.ALL | AD_Apply.FORCE | AD_Apply.BUFFERED_REFRESH);
8             System.Runtime.InteropServices.Marshal.ReleaseComObject(iad);
9         }

只需要调用SetWallpaper函数,然后释放该COMObject就可以实现fade效果的切换壁纸。

调用该函数的实际效果是,在win7的主题中有一个未保存的主题,该主题总是包含你切换的最后一张图片。

附上项目文件,供有兴趣的同学参考

https://files.cnblogs.com/linbirg/AutoDesk.rar

原文地址:https://www.cnblogs.com/linbirg/p/2578534.html