c# 使用ActiveDesktop实现壁纸切换,适合大部分图片格式

我的广告单元,有空点一下哦,谢谢!
操作步骤:

首先添加类:

using System;
using System.Runtime.InteropServices;

namespace WorkHelper
{
    enum WPSTYLE
    {
        CENTER = 0,
        TILE = 1,
        STRETCH = 2,
        MAX = 3
    }

    struct WALLPAPEROPT
    {
        public int dwSize;
        public WPSTYLE dwStyle;
    }

    struct COMPONENTSOPT
    {
        public int dwSize;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fEnableComponents;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fActiveDesktop;
    }

    struct COMPPOS
    {
        public const int COMPONENT_TOP = 0x3FFFFFFF;
        public const int COMPONENT_DEFAULT_LEFT = 0xFFFF;
        public const int COMPONENT_DEFAULT_TOP = 0xFFFF;

        public int dwSize;
        public int iLeft;
        public int iTop;
        public int dwWidth;
        public int dwHeight;
        public int izIndex;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fCanResize;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fCanResizeX;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fCanResizeY;
        public int iPreferredLeftPercent;
        public int iPreferredTopPercent;
    }

    [Flags]
    enum ITEMSTATE
    {
        NORMAL = 0x00000001,
        FULLSCREEN = 00000002,
        SPLIT = 0x00000004,
        VALIDSIZESTATEBITS = NORMAL | SPLIT | FULLSCREEN,
        VALIDSTATEBITS = NORMAL | SPLIT | FULLSCREEN | unchecked((int)0x80000000) | 0x40000000
    }

    struct COMPSTATEINFO
    {
        public int dwSize;
        public int iLeft;
        public int iTop;
        public int dwWidth;
        public int dwHeight;
        public int dwItemState;
    }

    enum COMP_TYPE
    {
        HTMLDOC = 0,
        PICTURE = 1,
        WEBSITE = 2,
        CONTROL = 3,
        CFHTML = 4,
        MAX = 4
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    struct COMPONENT
    {
        private const int INTERNET_MAX_URL_LENGTH = 2084;   //   =   
        // INTERNET_MAX_SCHEME_LENGTH   (32)   +   "://\0".Length   +   
        // INTERNET_MAX_PATH_LENGTH   (2048)  

        public int dwSize;
        public int dwID;
        public COMP_TYPE iComponentType;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fChecked;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fDirty;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fNoScroll;
        public COMPPOS cpPos;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string wszFriendlyName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = INTERNET_MAX_URL_LENGTH)]
        public string wszSource;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = INTERNET_MAX_URL_LENGTH)]
        public string wszSubscribedURL;

#if   AD_IE5   
      public   int   dwCurItemState;   
      public   COMPSTATEINFO   csiOriginal;   
      public   COMPSTATEINFO   csiRestored;   
#endif
    }

    enum DTI_ADTIWUI
    {
        DTI_ADDUI_DEFAULT = 0x00000000,
        DTI_ADDUI_DISPSUBWIZARD = 0x00000001,
        DTI_ADDUI_POSITIONITEM = 0x00000002,
    }

    [Flags]
    enum AD_APPLY
    {
        SAVE = 0x00000001,
        HTMLGEN = 0x00000002,
        REFRESH = 0x00000004,
        ALL = SAVE | HTMLGEN | REFRESH,
        FORCE = 0x00000008,
        BUFFERED_REFRESH = 0x00000010,
        DYNAMICREFRESH = 0x00000020
    }

    [Flags]
    enum COMP_ELEM
    {
        TYPE = 0x00000001,
        CHECKED = 0x00000002,
        DIRTY = 0x00000004,
        NOSCROLL = 0x00000008,
        POS_LEFT = 0x00000010,
        POS_TOP = 0x00000020,
        SIZE_WIDTH = 0x00000040,
        SIZE_HEIGHT = 0x00000080,
        POS_ZINDEX = 0x00000100,
        SOURCE = 0x00000200,
        FRIENDLYNAME = 0x00000400,
        SUBSCRIBEDURL = 0x00000800,
        ORIGINAL_CSI = 0x00001000,
        RESTORED_CSI = 0x00002000,
        CURITEMSTATE = 0x00004000,
        ALL = TYPE | CHECKED | DIRTY | NOSCROLL | POS_LEFT | SIZE_WIDTH |
            SIZE_HEIGHT | POS_ZINDEX | SOURCE |
            FRIENDLYNAME | POS_TOP | SUBSCRIBEDURL | ORIGINAL_CSI |
            RESTORED_CSI | CURITEMSTATE
    }

    [Flags]
    enum ADDURL
    {
        SILENT = 0x0001
    }

    [
        ComImport(),
        Guid("F490EB00-1240-11D1-9888-006097DEACF9"),
        InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
    ]
    interface IActiveDesktop
    {
        void ApplyChanges(AD_APPLY dwFlags);
        void GetWallpaper([MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder pwszWallpaper, int cchWallpaper, int dwReserved);
        void SetWallpaper([MarshalAs(UnmanagedType.LPWStr)]   string pwszWallpaper, int dwReserved);
        void GetWallpaperOptions(ref   WALLPAPEROPT pwpo, int dwReserved);
        void SetWallpaperOptions([In]   ref   WALLPAPEROPT pwpo, int dwReserved);
        void GetPattern([MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder pwszPattern, int cchPattern, int dwReserved);
        void SetPattern([MarshalAs(UnmanagedType.LPWStr)]   string pwszPattern, int dwReserved);
        void GetDesktopItemOptions(ref   COMPONENTSOPT pco, int dwReserved);
        void SetDesktopItemOptions([In]   ref   COMPONENTSOPT pco, int dwReserved);
        void AddDesktopItem([In]   ref   COMPONENT pcomp, int dwReserved);
        void AddDesktopItemWithUI(IntPtr hwnd, [In]   ref   COMPONENT pcomp, DTI_ADTIWUI dwFlags);
        void ModifyDesktopItem([In]   ref   COMPONENT pcomp, COMP_ELEM dwFlags);
        void RemoveDesktopItem([In]   ref   COMPONENT pcomp, int dwReserved);
        void GetDesktopItemCount(out   int lpiCount, int dwReserved);
        void GetDesktopItem(int nComponent, ref   COMPONENT pcomp, int dwReserved);
        void GetDesktopItemByID(IntPtr dwID, ref   COMPONENT pcomp, int dwReserved);
        void GenerateDesktopItemHtml([MarshalAs(UnmanagedType.LPWStr)] string pwszFileName, [In]   ref   COMPONENT pcomp, int dwReserved);
        void AddUrl(IntPtr hwnd, [MarshalAs(UnmanagedType.LPWStr)]   string pszSource, [In]   ref   COMPONENT pcomp, ADDURL dwFlags);
        void GetDesktopItemBySource([MarshalAs(UnmanagedType.LPWStr)] string pwszSource, ref   COMPONENT pcomp, int dwReserved);
    }

    [
        ComImport(),
        Guid("75048700-EF1F-11D0-9888-006097DEACF9")
    ]
    class ActiveDesktop   /*   :   IActiveDesktop   */   { }
}


调用:(终于搞定背景图片样式了)

public bool SetDeskBg(String filename)
        {
            try
            {
                ActiveDesktop ad = new ActiveDesktop();
                IActiveDesktop iad = ad as IActiveDesktop;
                if (iad != null)
                {
                    //WPSTYLE_CENTER 居中 0
                    //WPSTYLE_TILE 平铺 1
                    //WPSTYLE_STRETCH 拉伸 2 
                    WPSTYLE dwstyle = WPSTYLE.STRETCH;//这里调整显示背景图片样式
                    WALLPAPEROPT wp = new WALLPAPEROPT();
                    wp.dwSize = System.Runtime.InteropServices.Marshal.SizeOf(wp);
                    wp.dwStyle = dwstyle;
                    iad.SetWallpaperOptions(ref wp, 0);

                    iad.SetWallpaper(filename, 0);
                    iad.ApplyChanges(AD_APPLY.ALL);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(ad);
                    ad = null;
                }
                return true;
            }
            catch
            {
                return false;
            }
        }

你可能感兴趣的:(c# 使用ActiveDesktop实现壁纸切换,适合大部分图片格式)