windows系统桌面壁纸切换的三种csharp办法,兼容win10及旧版,还有一个现成 ...

打印 上一主题 下一主题

主题 847|帖子 847|积分 2541

我自己用这些代码做的小app如下:

第一种,user32.dll
  1. /// <summary>
  2.         /// 调用外部切换壁纸的方法
  3.         /// </summary>
  4.         /// <param name="uAction"></param>
  5.         /// <param name="uParam"></param>
  6.         /// <param name="lpvParam"></param>
  7.         /// <param name="fuWinIni"></param>
  8.         /// <returns></returns>
  9.         [DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
  10.         public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
复制代码
就是一种很常用,好像兼容性最好的办法吧,但是,使用的局限性很大,多显示器情况下会导致所有显示器使用相同的壁纸!而且无法区分多个显示器
第二种,IActiveDesktop
  1. public class ActiveDesktopCom
  2.     {
  3.         /// <summary>
  4.         /// 壁纸的显示方式
  5.         /// </summary>
  6.         public enum WPSTYLE
  7.         {
  8.             /// <summary>
  9.             /// 居中
  10.             /// </summary>
  11.             CENTER = 0,
  12.             /// <summary>
  13.             /// 平铺
  14.             /// </summary>
  15.             TILE = 1,
  16.             /// <summary>
  17.             /// 拉伸
  18.             /// </summary>
  19.             STRETCH = 2,
  20.             /// <summary>
  21.             /// 适应
  22.             /// </summary>
  23.             adapt = 3,
  24.             /// <summary>
  25.             /// 填充
  26.             /// </summary>
  27.             FILL = 4,
  28.             /// <summary>
  29.             /// 跨区
  30.             /// </summary>
  31.             Transregional = 5,
  32.         }
  33.         struct WALLPAPEROPT
  34.         {
  35.             public int dwSize;
  36.             public WPSTYLE dwStyle;
  37.         }
  38.         struct COMPONENTSOPT
  39.         {
  40.             public int dwSize;
  41.             [MarshalAs(UnmanagedType.Bool)]
  42.             public bool fEnableComponents;
  43.             [MarshalAs(UnmanagedType.Bool)]
  44.             public bool fActiveDesktop;
  45.         }
  46.         struct COMPPOS
  47.         {
  48.             public const int COMPONENT_TOP = 0x3FFFFFFF;
  49.             public const int COMPONENT_DEFAULT_LEFT = 0xFFFF;
  50.             public const int COMPONENT_DEFAULT_TOP = 0xFFFF;
  51.             public int dwSize;
  52.             public int iLeft;
  53.             public int iTop;
  54.             public int dwWidth;
  55.             public int dwHeight;
  56.             public int izIndex;
  57.             [MarshalAs(UnmanagedType.Bool)]
  58.             public bool fCanResize;
  59.             [MarshalAs(UnmanagedType.Bool)]
  60.             public bool fCanResizeX;
  61.             [MarshalAs(UnmanagedType.Bool)]
  62.             public bool fCanResizeY;
  63.             public int iPreferredLeftPercent;
  64.             public int iPreferredTopPercent;
  65.         }
  66.         [Flags]
  67.         enum ITEMSTATE
  68.         {
  69.             NORMAL = 0x00000001,
  70.             FULLSCREEN = 00000002,
  71.             SPLIT = 0x00000004,
  72.             VALIDSIZESTATEBITS = NORMAL | SPLIT | FULLSCREEN,
  73.             VALIDSTATEBITS = NORMAL | SPLIT | FULLSCREEN | unchecked((int)0x80000000) | 0x40000000
  74.         }
  75.         struct COMPSTATEINFO
  76.         {
  77.             public int dwSize;
  78.             public int iLeft;
  79.             public int iTop;
  80.             public int dwWidth;
  81.             public int dwHeight;
  82.             public int dwItemState;
  83.         }
  84.         enum COMP_TYPE
  85.         {
  86.             HTMLDOC = 0,
  87.             PICTURE = 1,
  88.             WEBSITE = 2,
  89.             CONTROL = 3,
  90.             CFHTML = 4,
  91.             MAX = 4
  92.         }
  93.         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  94.         struct COMPONENT
  95.         {
  96.             private const int INTERNET_MAX_URL_LENGTH = 2084;   //   =   
  97.                                                                 // INTERNET_MAX_SCHEME_LENGTH   (32)   +   "://\0".Length   +   
  98.                                                                 // INTERNET_MAX_PATH_LENGTH   (2048)  
  99.             public int dwSize;
  100.             public int dwID;
  101.             public COMP_TYPE iComponentType;
  102.             [MarshalAs(UnmanagedType.Bool)]
  103.             public bool fChecked;
  104.             [MarshalAs(UnmanagedType.Bool)]
  105.             public bool fDirty;
  106.             [MarshalAs(UnmanagedType.Bool)]
  107.             public bool fNoScroll;
  108.             public COMPPOS cpPos;
  109.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
  110.             public string wszFriendlyName;
  111.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = INTERNET_MAX_URL_LENGTH)]
  112.             public string wszSource;
  113.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = INTERNET_MAX_URL_LENGTH)]
  114.             public string wszSubscribedURL;
  115. #if AD_IE5
  116.     public   int   dwCurItemState;   
  117.     public   COMPSTATEINFO   csiOriginal;   
  118.     public   COMPSTATEINFO   csiRestored;   
  119. #endif
  120.         }
  121.         enum DTI_ADTIWUI
  122.         {
  123.             DTI_ADDUI_DEFAULT = 0x00000000,
  124.             DTI_ADDUI_DISPSUBWIZARD = 0x00000001,
  125.             DTI_ADDUI_POSITIONITEM = 0x00000002,
  126.         }
  127.         [Flags]
  128.         enum AD_APPLY
  129.         {
  130.             SAVE = 0x00000001,
  131.             HTMLGEN = 0x00000002,
  132.             REFRESH = 0x00000004,
  133.             ALL = SAVE | HTMLGEN | REFRESH,
  134.             FORCE = 0x00000008,
  135.             BUFFERED_REFRESH = 0x00000010,
  136.             DYNAMICREFRESH = 0x00000020
  137.         }
  138.         [Flags]
  139.         enum COMP_ELEM
  140.         {
  141.             TYPE = 0x00000001,
  142.             CHECKED = 0x00000002,
  143.             DIRTY = 0x00000004,
  144.             NOSCROLL = 0x00000008,
  145.             POS_LEFT = 0x00000010,
  146.             POS_TOP = 0x00000020,
  147.             SIZE_WIDTH = 0x00000040,
  148.             SIZE_HEIGHT = 0x00000080,
  149.             POS_ZINDEX = 0x00000100,
  150.             SOURCE = 0x00000200,
  151.             FRIENDLYNAME = 0x00000400,
  152.             SUBSCRIBEDURL = 0x00000800,
  153.             ORIGINAL_CSI = 0x00001000,
  154.             RESTORED_CSI = 0x00002000,
  155.             CURITEMSTATE = 0x00004000,
  156.             ALL = TYPE | CHECKED | DIRTY | NOSCROLL | POS_LEFT | SIZE_WIDTH |
  157.                 SIZE_HEIGHT | POS_ZINDEX | SOURCE |
  158.                 FRIENDLYNAME | POS_TOP | SUBSCRIBEDURL | ORIGINAL_CSI |
  159.                 RESTORED_CSI | CURITEMSTATE
  160.         }
  161.         [Flags]
  162.         enum ADDURL
  163.         {
  164.             SILENT = 0x0001
  165.         }
  166.         [
  167.             ComImport(),
  168.             Guid("F490EB00-1240-11D1-9888-006097DEACF9"),
  169.             InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
  170.         ]
  171.         interface IActiveDesktop
  172.         {
  173.             void ApplyChanges(AD_APPLY dwFlags);
  174.             void GetWallpaper([MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder pwszWallpaper, int cchWallpaper, int dwReserved);
  175.             void SetWallpaper([MarshalAs(UnmanagedType.LPWStr)] string pwszWallpaper, int dwReserved);
  176.             void GetWallpaperOptions(ref WALLPAPEROPT pwpo, int dwReserved);
  177.             void SetWallpaperOptions([In] ref WALLPAPEROPT pwpo, int dwReserved);
  178.             void GetPattern([MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder pwszPattern, int cchPattern, int dwReserved);
  179.             void SetPattern([MarshalAs(UnmanagedType.LPWStr)] string pwszPattern, int dwReserved);
  180.             void GetDesktopItemOptions(ref COMPONENTSOPT pco, int dwReserved);
  181.             void SetDesktopItemOptions([In] ref COMPONENTSOPT pco, int dwReserved);
  182.             void AddDesktopItem([In] ref COMPONENT pcomp, int dwReserved);
  183.             void AddDesktopItemWithUI(IntPtr hwnd, [In] ref COMPONENT pcomp, DTI_ADTIWUI dwFlags);
  184.             void ModifyDesktopItem([In] ref COMPONENT pcomp, COMP_ELEM dwFlags);
  185.             void RemoveDesktopItem([In] ref COMPONENT pcomp, int dwReserved);
  186.             void GetDesktopItemCount(out int lpiCount, int dwReserved);
  187.             void GetDesktopItem(int nComponent, ref COMPONENT pcomp, int dwReserved);
  188.             void GetDesktopItemByID(IntPtr dwID, ref COMPONENT pcomp, int dwReserved);
  189.             void GenerateDesktopItemHtml([MarshalAs(UnmanagedType.LPWStr)] string pwszFileName, [In] ref COMPONENT pcomp, int dwReserved);
  190.             void AddUrl(IntPtr hwnd, [MarshalAs(UnmanagedType.LPWStr)] string pszSource, [In] ref COMPONENT pcomp, ADDURL dwFlags);
  191.             void GetDesktopItemBySource([MarshalAs(UnmanagedType.LPWStr)] string pwszSource, ref COMPONENT pcomp, int dwReserved);
  192.         }
  193.         [
  194.             ComImport(),
  195.             Guid("75048700-EF1F-11D0-9888-006097DEACF9")
  196.         ]
  197.         class ActiveDesktop   /*   :   IActiveDesktop   */   { }
  198.         public class OLE32DLL
  199.         {
  200.             [DllImport("ole32.dll", SetLastError = true)]
  201.             public static extern int CoUninitialize();
  202.             [DllImport("ole32.dll", SetLastError = true)]
  203.             public static extern int CoInitialize(int pvReserved);
  204.             [DllImport("ole32.dll", CharSet = CharSet.Unicode)]
  205.             public static extern int CLSIDFromString(string lpsz, out Guid pclsid);
  206.             [DllImport("ole32.dll", ExactSpelling = true, PreserveSig = false)]
  207.             [return: MarshalAs(UnmanagedType.Interface)]
  208.             public static extern object CoCreateInstance(
  209.                 [In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
  210.                 int pUnkOuter,
  211.                 int dwClsContext,
  212.                 [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid
  213.             );
  214.         }
  215.         /// <summary>
  216.         /// 兼容win7版本以前版本系统的修改壁纸
  217.         /// </summary>
  218.         /// <param name="filename"></param>
  219.         /// <returns></returns>
  220.         public static bool SetActiveDesktop(string filename, WPSTYLE dwstyle = WPSTYLE.FILL)
  221.         {
  222.             try
  223.             {
  224.                 const int NULL = 0;
  225.                 const int S_OK = 0;
  226.                 const int CLSCTX_ALL = 23;
  227.                 Guid IID_IActiveDesktop = new Guid("F490EB00-1240-11D1-9888-006097DEACF9");
  228.                 Guid CLSID_ActiveDesktop = new Guid("75048700-EF1F-11D0-9888-006097DEACF9");
  229.                 if (System.Threading.Thread.CurrentThread.GetApartmentState() != System.Threading.ApartmentState.STA && OLE32DLL.CoInitialize(NULL) < S_OK)
  230.                     throw new Exception("Failed to initialize COM library.");
  231.                 //object ppvObject = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_ALL, IID_IActiveDesktop);
  232.                 //ActiveDesktop ad = new ActiveDesktop();
  233.                 object ad = OLE32DLL.CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_ALL, IID_IActiveDesktop);
  234.                 IActiveDesktop iad = (IActiveDesktop)ad;
  235.                 if (iad != null)
  236.                 {
  237.                     //WPSTYLE_CENTER 居中 0
  238.                     //WPSTYLE_TILE 平铺 1
  239.                     //WPSTYLE_STRETCH 拉伸 2
  240.                     //WPSTYLE dwstyle = WPSTYLE.FILL;//这里调整显示背景图片样式
  241.                     WALLPAPEROPT wp = new WALLPAPEROPT();
  242.                     wp.dwSize = System.Runtime.InteropServices.Marshal.SizeOf(wp);
  243.                     wp.dwStyle = dwstyle;
  244.                     iad.SetWallpaperOptions(ref wp, 0);
  245.                     iad.SetWallpaper(filename, 0);
  246.                     iad.ApplyChanges(AD_APPLY.ALL);//AD_APPLY.ALL);
  247.                     //System.Runtime.InteropServices.Marshal.ReleaseComObject(ad);
  248.                     //ad = null;
  249.                 }
  250.                 OLE32DLL.CoUninitialize();
  251.                 return true;
  252.             }
  253.             catch
  254.             {
  255.                 return false;
  256.             }
  257.         }
  258.     }
复制代码
以上代码也是我从网上流传的代码中复制到的,但是网上流传的代码中其中有一部分代码是有问题的:
  1. ActiveDesktop ad = new ActiveDesktop();
复制代码
就是这里,这个代码不可运行,因为这种接口中IActiveDesktop对象不能通过类型强转得到,因为ActiveDesktop实例本身就不是通过new方式得到的,而我的代码中已经将这个错误进行了修改,并且win10系统中已经确认运行无误。
第三种,IDesktopWallpaper也是一种Com接口(只支持win8以上系统,且支持多显示器独立设置壁纸)
  1. /// <summary>
  2.     /// 使用IDesktopWallpaper方式切换壁纸的方法
  3.     /// </summary>
  4.     public class DesktopWallpaperCom
  5.     {
  6.         [ComImport]
  7.         [Guid("B92B56A9-8B55-4E14-9A89-0199BBB6F93B")]
  8.         [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  9.         public interface IDesktopWallpaper
  10.         {
  11.             void SetWallpaper([MarshalAs(UnmanagedType.LPWStr)] string monitorID, [MarshalAs(UnmanagedType.LPWStr)] string wallpaper);
  12.             [return: MarshalAs(UnmanagedType.LPWStr)]
  13.             string GetWallpaper([MarshalAs(UnmanagedType.LPWStr)] string monitorID);
  14.             [return: MarshalAs(UnmanagedType.LPWStr)]
  15.             string GetMonitorDevicePathAt(uint monitorIndex);
  16.             [return: MarshalAs(UnmanagedType.U4)]
  17.             uint GetMonitorDevicePathCount();
  18.             [return: MarshalAs(UnmanagedType.Struct)]
  19.             Rect GetMonitorRECT([MarshalAs(UnmanagedType.LPWStr)] string monitorID);
  20.             void SetBackgroundColor([MarshalAs(UnmanagedType.U4)] uint color);
  21.             [return: MarshalAs(UnmanagedType.U4)]
  22.             uint GetBackgroundColor();
  23.             void SetPosition([MarshalAs(UnmanagedType.I4)] DesktopWallpaperPosition position);
  24.             [return: MarshalAs(UnmanagedType.I4)]
  25.             DesktopWallpaperPosition GetPosition();
  26.             void SetSlideshow(IntPtr items);
  27.             IntPtr GetSlideshow();
  28.             void SetSlideshowOptions(DesktopSlideshowDirection options, uint slideshowTick);
  29.             void GetSlideshowOptions(out DesktopSlideshowDirection options, out uint slideshowTick);
  30.             void AdvanceSlideshow([MarshalAs(UnmanagedType.LPWStr)] string monitorID, [MarshalAs(UnmanagedType.I4)] DesktopSlideshowDirection direction);
  31.             DesktopSlideshowDirection GetStatus();
  32.             bool Enable();
  33.         }
  34.         [ComImport]
  35.         [Guid("C2CF3110-460E-4fc1-B9D0-8A1C0C9CC4BD")]
  36.         public class DesktopWallpaper
  37.         {
  38.         }
  39.         [Flags]
  40.         public enum DesktopSlideshowOptions
  41.         {
  42.             None = 0,
  43.             ShuffleImages = 0x01
  44.         }
  45.         [Flags]
  46.         public enum DesktopSlideshowState
  47.         {
  48.             None = 0,
  49.             Enabled = 0x01,
  50.             Slideshow = 0x02,
  51.             DisabledByRemoteSession = 0x04
  52.         }
  53.         public enum DesktopSlideshowDirection
  54.         {
  55.             Forward = 0,
  56.             Backward = 1
  57.         }
  58.         public enum DesktopWallpaperPosition
  59.         {
  60.             Center = 0,
  61.             Tile = 1,
  62.             Stretch = 2,
  63.             Fit = 3,
  64.             Fill = 4,
  65.             Span = 5,
  66.         }
  67.         [StructLayout(LayoutKind.Sequential)]
  68.         public struct Rect
  69.         {
  70.             public int Left;
  71.             public int Top;
  72.             public int Right;
  73.             public int Bottom;
  74.         }
  75.         /// <summary>
  76.         /// 获取所有的显示器的ID,用于在设置壁纸中用到的显示器的id
  77.         /// </summary>
  78.         /// <returns></returns>
  79.         public static string[] GetDeskMonitorIds()
  80.         {
  81.             try
  82.             {
  83.                 DesktopWallpaper ad = new DesktopWallpaper();
  84.                 IDesktopWallpaper iad = (IDesktopWallpaper)ad;
  85.                 List<string> mids = new List<string>();
  86.                 if (iad != null)
  87.                 {
  88.                     for (uint i = 0; i < iad.GetMonitorDevicePathCount(); i++)
  89.                     {
  90.                         mids.Add(iad.GetMonitorDevicePathAt(i));
  91.                     }
  92.                 }
  93.                 System.Runtime.InteropServices.Marshal.ReleaseComObject(ad);
  94.                 ad = null;
  95.                 return mids.ToArray();
  96.             }
  97.             catch
  98.             {
  99.                 return null;
  100.             }
  101.         }
  102.         /// <summary>
  103.         /// 新版的win8以上版本调用修改桌面的方法
  104.         /// </summary>
  105.         /// <param name="filename"></param>
  106.         /// <returns></returns>
  107.         public static bool SetDesktopWallpaper(string filename, string mid = null)
  108.         {
  109.             try
  110.             {
  111.                 DesktopWallpaper ad = new DesktopWallpaper();
  112.                 IDesktopWallpaper iad = (IDesktopWallpaper)ad;
  113.                 if (iad != null)
  114.                 {
  115.                     iad.SetWallpaper(mid ?? string.Empty, filename);
  116.                 }
  117.                 System.Runtime.InteropServices.Marshal.ReleaseComObject(ad);
  118.                 ad = null;
  119.                 return true;
  120.             }
  121.             catch
  122.             {
  123.                 return false;
  124.             }
  125.         }
  126.     }
复制代码
这是win8系统以上才支持的一种桌面壁纸切换方法,可以支持多显示器独立进行壁纸的设置
最后放上我自己做的壁纸切换工具,可以自适应切换壁纸的方式,且支持多显示器壁纸切换管理和收藏,还有可以添加自动切换壁纸的系统任务,其中的有个vbs脚本是用于壁纸切换的,杀软一般都会报毒,但是要是文件没了就无法切换壁纸了。
下载地址是:https://comm.zhaimaojun.cn/AllSources/ToolDetail/?tid=9379
以上。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表