win7自动壁纸切换小工具AutoDesk二:fade effect的壁纸切换
要实现壁纸切换,可以用函数WinAPI.SystemParametersInfo(20, 1, strSavePath, 1)来实现。strSavePath为图片的位置,实际测下来该函数并不要求图片一定是bmp格式,jpg|png也都可以的。
函数的原型声明如下:
1 class WinAPI
2 {
3
4
5 public staticextern 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
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
35 public struct COMPONENTSOPT
36 {
37 public static readonly int SizeOf = Marshal.SizeOf(typeof(COMPONENTSOPT));
38 public int dwSize;
39
40 public bool fEnableComponents;
41
42 public bool fActiveDesktop;
43 }
44
45
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
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
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
82 public bool fCanResize;
83
84 public bool fCanResizeX;
85
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
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
110 public bool fChecked;
111
112 public bool fDirty;
113
114 public bool fNoScroll;
115 public COMPPOS cpPos;
116
117 public string wszFriendlyName;
118
119 public string wszSource;
120
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
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
160 public enum AddURL : int
161 {
162 SILENT = 0x0001
163 }
164
165
166
167
168 public interface IActiveDesktop
169 {
170
171 int ApplyChanges(AD_Apply dwFlags);
172
173 int GetWallpaper(System.Text.StringBuilder pwszWallpaper,
174 int cchWallpaper,
175 int dwReserved);
176
177 int SetWallpaper( string pwszWallpaper, int dwReserved);
178
179 int GetWallpaperOptions(ref WALLPAPEROPT pwpo, int dwReserved);
180
181 int SetWallpaperOptions(ref WALLPAPEROPT pwpo, int dwReserved);
182
183 int GetPattern( System.Text.StringBuilder pwszPattern, int cchPattern, int dwReserved);
184
185 int SetPattern( string pwszPattern, int dwReserved);
186
187 int GetDesktopItemOptions(ref COMPONENTSOPT pco, int dwReserved);
188
189 int SetDesktopItemOptions(ref COMPONENTSOPT pco, int dwReserved);
190
191 int AddDesktopItem(ref COMPONENT pcomp, int dwReserved);
192
193 int AddDesktopItemWithUI(IntPtr hwnd, ref COMPONENT pcomp, DtiAddUI dwFlags);
194
195 int ModifyDesktopItem(ref COMPONENT pcomp, ComponentModify dwFlags);
196
197 int RemoveDesktopItem(ref COMPONENT pcomp, int dwReserved);
198
199 int GetDesktopItemCount(out int lpiCount, int dwReserved);
200
201 int GetDesktopItem(int nComponent, ref COMPONENT pcomp, int dwReserved);
202
203 int GetDesktopItemByID(IntPtr dwID, ref COMPONENT pcomp, int dwReserved);
204
205 int GenerateDesktopItemHtml( string pwszFileName, ref COMPONENT pcomp, int dwReserved);
206
207 int AddUrl(IntPtr hwnd, string pszSource, ref COMPONENT pcomp, AddURL dwFlags);
208
209 int GetDesktopItemBySource( string pwszSource, ref COMPONENT pcomp, int dwReserved);
210
211 }
212
213 ///
214 /// Summary description for shlobj.
215 /// Written by: Eber Irigoyen
216 /// on: 11/23/2005
217 ///
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的主题中有一个未保存的主题,该主题总是包含你切换的最后一张图片。
附上项目文件,供有兴趣的同学参考
http://files.iyunv.com/linbirg/AutoDesk.rar
页:
[1]