gz13802424 发表于 2019-1-10 23:02:32

SystemParametersInfo\IActiveDesktop(与壁纸相关的部分)

本帖最后由 gz13802424 于 2019-1-14 23:37 编辑

设备壁纸的方法有二个SystemParametersInfo和IActiveDesktop
方法一:SystemParametersInfo是通过DLL调用来实现
方法二:IActiveDesktop是通过COM组件来实现

---------------------------------------方法一:SystemParametersInfo---------------------------------------
在学习通过au3设置壁纸时在网上搜索到以下的示例

$Spi_SetDeskWallPaper = 0x14
$SPIF_SENDWININICHANGE = 0x0002
$tPaperPath = DllStructCreate("char")
DllStructSetData($tPaperPath, 1, $szPaperPath)
$iResult = DllCall("user32.dll", "int", "SystemParametersInfo", "bool", $Spi_SetDeskWallPaper, "uint", 0, "struct*", $tPaperPath, "uint", $SPIF_SENDWININICHANGE)

但是这个示例的代码,只可以把 非中文路径 和 非中文文件名称 的文件设置为壁纸
通过下面的修改才可以支持 中文路径 和 中文文件名称

$Spi_SetDeskWallPaper = 0x14
$SPIF_UPDATEINIFILE = 0x0001
$SPIF_SENDWININICHANGE = 0x0002
$tPaperPath = DllStructCreate("wchar")

DllStructSetData($tPaperPath, 1, $szPaperPath)
$iResult = DllCall("user32.dll", "int", "SystemParametersInfoW", "bool", $Spi_SetDeskWallPaper, "uint", 0,"struct*", $tPaperPath, "uint", $SPIF_UPDATEINIFILE + $SPIF_SENDWININICHANGE)

---------------------------------------方法二:IActiveDesktop---------------------------------------
关于IActiveDesktop的调用,C语言调用的示例子不少,但是AU3调用的示例就基本上找不到,后来经过反复调整搜索的关键字,总算在AU3的外文论坛上找到一个大神书写的示例
下面的代码蓝色内容为我自己学习时添加上去的部分

#interface "IActiveDesktop"
Global Const $sCLSID_ActiveDesktop = "{75048700-EF1F-11D0-9888-006097DEACF9}"
Global Const $sIID_IActiveDesktop = "{F490EB00-1240-11D1-9888-006097DEACF9}"
Global Const $tagIActiveDesktop = _
                "ApplyChanges hresult(dword);" & _
                "GetWallpaper hresult(wstr;uint;dword);" & _
                "SetWallpaper hresult(wstr;dword);" & _
                "GetWallpaperOptions hresult(struct*;dword);" & _
                "SetWallpaperOptions hresult(struct*;dword);" & _
                "GetPattern hresult(wstr;uint;dword);" & _
                "SetPattern hresult(wstr;dword);" & _
                "GetDesktopItemOptions hresult(struct*;dword);" & _
                "SetDesktopItemOptions hresult(struct*;dword);" & _
                "AddDesktopItem hresult(struct*;dword);" & _
                "AddDesktopItemWithUI hresult(hwnd;struct*;dword);" & _
                "ModifyDesktopItem hresult(struct*;dword);" & _
                "RemoveDesktopItem hresult(struct*;dword);" & _
                "GetDesktopItemCount hresult(int*;dword);" & _
                "GetDesktopItem hresult(int;struct*;dword);" & _
                "GetDesktopItemByID hresult(ulong_ptr;struct*;dword);" & _
                "GenerateDesktopItemHtml hresult(wstr;struct*;dword);" & _
                "AddUrl hresult(hwnd;wstr;struct*;dword);" & _
                "GetDesktopItemBySource hresult(wstr;struct*;dword);"
;===============================================================================

Global Const $AD_APPLY_SAVE = 0x00000001
Global Const $AD_APPLY_HTMLGEN = 0x00000002
Global Const $AD_APPLY_REFRESH = 0x00000004
Global Const $AD_APPLY_ALL = 0x00000007 ;(AD_APPLY_SAVE | AD_APPLY_HTMLGEN | AD_APPLY_REFRESH)
Global Const $AD_APPLY_FORCE = 0x00000008
Global Const $AD_APPLY_BUFFERED_REFRESH = 0x00000010

Global Const $AD_GETWP_BMP = 0x00000000 ;Get a bitmap.
Global Const $AD_GETWP_IMAGE = 0x00000001 ;Get an image.
Global Const $AD_GETWP_LAST_APPLIED = 0x00000002 ;Get the type of wallpaper that was last applied

Global Const $WPSTYLE_CENTER      = 0x0   ;居中
Global Const $WPSTYLE_TILE      = 0x1   ;平铺
Global Const $WPSTYLE_STRETCH   = 0x2   ;拉伸
Global Const $WPSTYLE_KEEPASPECT= 0x3   ;高度自适应
Global Const $WPSTYLE_CROPTOFIT   = 0x4   ;宽度自适应
Global Const $WPSTYLE_SPAN      = 0x5   ;跨屏

;;;;;;;;;;;;;;;;;;; Example ;;;;;;;;;;;;;;;;;;;;;;;;;;;
$oActiveDesktop = ObjCreateInterface($sCLSID_ActiveDesktop, $sIID_IActiveDesktop, $tagIActiveDesktop)

;读取壁纸
$DesktopWallPaper_File = ""
$oActiveDesktop.GetWallpaper($DesktopWallPaper_File, 256, $AD_GETWP_BMP)

$_tagWALLPAPEROPT = DllStructCreate("struct;DWORD dwSize;DWORD dwStyle;endstruct")
DllStructSetData($_tagWALLPAPEROPT, "dwSize", DllStructGetSize($_tagWALLPAPEROPT))
;读取壁纸样式
$oActiveDesktop.GetWallpaperOptions($_tagWALLPAPEROPT, 0)


DllStructSetData($_tagWALLPAPEROPT, "dwStyle", $WPSTYLE_SPAN)
;设置壁纸样式
$oActiveDesktop.SetWallpaperOptions($_tagWALLPAPEROPT, 0)

$sFile = FileOpenDialog("Select New Wallpaper", "", "Images (*.jpg;*.bmp;*.png;*.gif;*.whatever)") ; whatever
If $sFile Then
      $oActiveDesktop.SetWallpaper($sFile, 0)
      $oActiveDesktop.ApplyChanges($AD_APPLY_ALL)
EndIf


---------------------------------------分 割线---------------------------------------
在win7、win10的环境下,使用1个以上的屏幕变成非常简单,而且当使用两个以上的屏幕时,每个屏幕是可以分别设置为不同的壁纸


在这里求助各路大神,如果通过api来实现为每个屏幕单独设置独立的壁纸















haijie1223 发表于 2019-1-11 20:36:38

官网找的, 你可以试试。
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>
#include <ScreenCapture.au3>
#include <Constants.au3>
#include <Misc.au3>
#NoTrayIcon

Opt("GUIOnEventMode", 1)

;Baisc Settings
Global $Class_Blacklist = "|BasicWindow|SideBar_AppBarWindow|SideBar_AppBarBullet|Progman|Button|ThunderRT6FormDC|ROCKETDOCK|"
Global $Num_Of_Desktop = IniRead(@ScriptDir & "\Data.ini", "Setings", "Num_Of_Desktop", "4")
Global $Gui_Size = IniRead(@ScriptDir & "\Data.ini", "Setings", "Gui_Size", "80")
Global $Slide_Trans = True
Global $Fade_Trans = False
Global $Debug = False
Global $Trans_Speed = 400

;Stuffthat user should be able to control
Global $DesktopSize = WinGetClientSize("Program Manager")
Global Const $Ratio = $DesktopSize / $DesktopSize
Global $Desktop_Data[$Num_Of_Desktop]
Global $Desktop_Pic[$Num_Of_Desktop]
Global $Curent_Desktop = 0
Global $Sticky_Window
Global $Hover_Wait_Timer
Global $Form1, $Hover_Form
IniWrite(@ScriptDir & "\Data.ini", "Wallpaper", "Desktop_Default", _Wallpaper_Get())

For $x = 0 To $Num_Of_Desktop - 1
        $Desktop_Data[$x] = IniRead(@ScriptDir & "\Data.ini", "Wallpaper", "Desktop_" & $x + 1, _Wallpaper_Get())
        ConsoleWrite($Desktop_Data[$x] & @CRLF)
Next

Global $Form_Size_X = (($Gui_Size * $Ratio) * $Num_Of_Desktop) + ($Num_Of_Desktop * 5)
Global $Form_Size_Y = $Gui_Size + 10
Global $Default_Gui_Pos = IniRead(@ScriptDir & "\Data.ini", "Setings", "Default_Gui_Pos", $DesktopSize - 25 & "," & $DesktopSize - $Form_Size_Y - 32)
$Default_Gui_Pos = StringSplit($Default_Gui_Pos, ",")

$Form1 = GUICreate("", $Form_Size_X + 45, $Form_Size_Y, $Default_Gui_Pos, $Default_Gui_Pos, $WS_POPUP + $WS_BORDER, $WS_EX_TOPMOST + $WS_EX_TOOLWINDOW)
GUISetBkColor(0xccccff)
$Slide_Button = GUICtrlCreateButton("<", 5, 20, 15, $Form_Size_Y - 25)
$Exit_Button = GUICtrlCreateButton("X", 5, 5, 15, 15)
$Slide_Button2 = GUICtrlCreateButton(">", $Form_Size_X + 25, 20, 15, $Form_Size_Y - 25)
$Exit_Button2 = GUICtrlCreateButton("X", $Form_Size_X + 25, 5, 15, 15)
;GUICtrlCreateLabel("", 0,0, $Form_Size_X + 25, $Form_Size_X, -1, $GUI_WS_EX_PARENTDRAG)

;GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetBkColor($Slide_Button, 0xaaaaff)
GUICtrlSetBkColor($Slide_Button2, 0xaaaaff)
GUICtrlSetBkColor($Exit_Button, 0xaaaaff)
GUICtrlSetBkColor($Exit_Button2, 0xaaaaff)

GUICtrlSetOnEvent($Slide_Button, "_Slide")
GUICtrlSetOnEvent($Exit_Button, "_Exit")
GUICtrlSetOnEvent($Slide_Button2, "_Slide")
GUICtrlSetOnEvent($Exit_Button2, "_Exit")

For $x = 0 To $Num_Of_Desktop - 1
        $Desktop_Pic[$x] = GUICtrlCreatePic($Desktop_Data[$x], (($Gui_Size * $Ratio) * $x) + (5 * ($x)) + 25, 5, $Gui_Size * $Ratio, $Gui_Size)
Next

$Hover_Form = GUICreate("", $Gui_Size * $Ratio, $Gui_Size, 30, 5, $WS_POPUP, $WS_EX_TOPMOST + $WS_EX_TOOLWINDOW + $WS_EX_MDICHILD, $Form1)
GUISetBkColor(0xFFFFFF)

$Fade_Form = GUICreate("", $DesktopSize, $DesktopSize, 0, 0, $WS_POPUP, $WS_EX_TOPMOST + $WS_EX_TOOLWINDOW)
$Fade_Form_Pic = GUICtrlCreatePic("", 0, 0, 0, 0)

GUISetState(@SW_HIDE, $Fade_Form)
GUISetState(@SW_SHOW, $Form1)
GUISetState(@SW_SHOW, $Hover_Form)
WinSetTrans($Form1, "", 255)
WinSetTrans($Fade_Form, "", 255)
WinSetTrans($Hover_Form, "", 120)
WinSetOnTop($Form1, "", 1)

While 1
        Sleep(10)
        $Msg = _Effects()
        If $Msg Then _ChangeDesktop($Msg)
        _CheckWallpaper()
        _CheckHotKeys()
WEnd

Func _CheckWallpaper()
        If $Desktop_Data[$Curent_Desktop] <> _Wallpaper_Get() Then
                If @OSVersion = "WIN_VISTA" Then
                        IniWrite(@ScriptDir & "\Data.ini", "Wallpaper", "Desktop_" & $Curent_Desktop + 1, _Wallpaper_Get())
                        $Desktop_Data[$Curent_Desktop] = _Wallpaper_Get()
                Else
                        FileCopy(_Wallpaper_Get(), @ScriptDir & "\Desktop_" & $Curent_Desktop & ".bmp")
                        IniWrite(@ScriptDir & "\Data.ini", "Wallpaper", "Desktop_" & $Curent_Desktop + 1, @ScriptDir & "\Desktop_" & $Curent_Desktop & ".bmp")
                        $Desktop_Data[$Curent_Desktop] = @ScriptDir & "\Desktop_" & $Curent_Desktop & ".bmp"
                EndIf
        EndIf
EndFunc   ;==>_CheckWallpaper

Func _CheckHotKeys()
        If _IsPressed(27) And _IsPressed(11) And _IsPressed(12) Then
                $Sticky_Window = WinGetHandle("")
                If $Curent_Desktop = $Num_Of_Desktop - 1 Then
                        _ChangeDesktop(0)
                Else
                        _ChangeDesktop($Curent_Desktop + 1)
                EndIf

                Do
                        Sleep(1)
                Until _IsPressed(27) = 0 Or _IsPressed(11) = 0 Or _IsPressed(12) = 0
        ElseIf _IsPressed(25) And _IsPressed(11) And _IsPressed(12) Then
                $Sticky_Window = WinGetHandle("")
                If $Curent_Desktop = 0 Then
                        _ChangeDesktop($Num_Of_Desktop - 1)
                Else
                        _ChangeDesktop($Curent_Desktop - 1)
                EndIf

                Do
                        Sleep(1)
                Until _IsPressed(25) = 0 Or _IsPressed(11) = 0 Or _IsPressed(12) = 0
        EndIf
EndFunc   ;==>_CheckHotKeys

Func _Effects()
        Local $cur_desktop

        $Ginfo = GUIGetCursorInfo($Form1)
        If Not @error Then
                For $x = 0 To $Num_Of_Desktop - 1
                        If $Ginfo = $Desktop_Pic[$x] Then
                                $a_pos = ControlGetPos($Form1, "", $Desktop_Pic[$x])
                                $f_pos = WinGetPos($Form1)
                                WinMove($Hover_Form, "", $f_pos + $a_pos + 1, $f_pos + $a_pos + 1, $a_pos, $a_pos)
                                $Hover_Wait_Timer = 0
                                $cur_desktop = String($x)
                                ExitLoop
                        EndIf
                Next

                If $x = $Num_Of_Desktop And TimerDiff($Hover_Wait_Timer) > 500 And $Hover_Wait_Timer > 0 Then
                        $a_pos = ControlGetPos($Form1, "", $Desktop_Pic[$Curent_Desktop])
                        $f_pos = WinGetPos($Form1)
                        WinMove($Hover_Form, "", $f_pos + $a_pos + 1, $f_pos + $a_pos + 1, $a_pos, $a_pos)
                        $Hover_Wait_Timer = 0
                ElseIf $x = $Num_Of_Desktop And $Hover_Wait_Timer = 0 Then
                        $Hover_Wait_Timer = TimerInit()
                EndIf

                If $Ginfo And $Ginfo = 0 And WinActive($Form1) Then
                        $a_pos = WinGetPos($Form1)
                        While _IsPressed(01)
                                If @error Then ExitLoop
                                $a_pos = MouseGetPos(1) - $Ginfo
                                If $a_pos >= $DesktopSize - $a_pos Then $a_pos = $DesktopSize - $a_pos
                                If $a_pos <= 0 Then $a_pos = 0
                                WinMove($Form1, "", $a_pos, $a_pos)
                                If MouseGetPos(0) > $DesktopSize / 2 And $a_pos <= 0 Then
                                        $a_pos = ($DesktopSize - $a_pos) - $a_pos
                                ElseIf MouseGetPos(0) < $DesktopSize / 2 And $a_pos + $a_pos >= $DesktopSize Then
                                        $a_pos = ($DesktopSize - $a_pos) - $a_pos
                                EndIf
                                Sleep(10)
                        WEnd
                        IniWrite(@ScriptDir & "\Data.ini", "Setings", "Default_Gui_Pos", $a_pos & "," & $a_pos)
                EndIf
        EndIf

        $Ginfo = GUIGetCursorInfo($Hover_Form)
        If @error Then Return

        If (WinActive($Form1) Or WinActive($Hover_Form)) And $Ginfo > 0 And $Ginfo < $Form_Size_X And $Ginfo > 0 And $Ginfo < $Form_Size_Y And $Ginfo Then Return $cur_desktop
EndFunc   ;==>_Effects

Func _Slide()
        Local $i_dir, $s_dir = 0
        Switch @GUI_CtrlId
                Case $Slide_Button
                        If GUICtrlRead($Slide_Button) = "<" Then $i_dir = 1
                        $s_dir = "Right"
                Case $Slide_Button2
                        If GUICtrlRead($Slide_Button2) = ">" Then $i_dir = 1
                        $s_dir = "Left"
        EndSwitch

        If $i_dir = 0 Then
                _WinSlide($Form1, $s_dir, $i_dir, 15, 25)
        Else
                _WinSlide($Form1, $s_dir, $i_dir, 15, 20)
        EndIf

        If GUICtrlRead($Slide_Button) = ">" Then
                GUICtrlSetData($Slide_Button, "<")
                GUICtrlSetData($Slide_Button2, ">")
        Else
                GUICtrlSetData($Slide_Button, ">")
                GUICtrlSetData($Slide_Button2, "<")
        EndIf

        Return
EndFunc   ;==>_Slide

Func _WinSlide($s_hwnd, $s_dir, $i_dir, $i_speed = 10, $i_Stop = 0)
        Local $a_pos = WinGetPos($Form1)
        Local $i_sleeptime = 10
        Local $i_step

        Switch $i_dir
                Case 0
                        Switch $s_dir
                                Case "Left"
                                        For $x = $a_pos - $i_Stop To $i_Stop Step -1 * _Sub($i_Stop, $a_pos) / $i_speed
                                                WinMove($s_hwnd, "", $x - $a_pos, $a_pos)
                                                Sleep($i_sleeptime)
                                        Next
                                        WinMove($s_hwnd, "", $i_Stop - $a_pos, $a_pos)
                                Case "Right"
                                        For $x = $DesktopSize - ($a_pos - $i_Stop) To $DesktopSize - $i_Stop Step _Sub($DesktopSize - ($a_pos - $i_Stop), $DesktopSize - $i_Stop) / $i_speed
                                                WinMove($s_hwnd, "", $x, $a_pos)
                                                Sleep($i_sleeptime)
                                        Next
                                        WinMove($s_hwnd, "", $DesktopSize - $i_Stop, $a_pos)
                                Case "Up"
                                        For $x = $a_pos To $i_Stop Step -1 * _Sub($i_Stop, $a_pos) / $i_speed
                                                WinMove($s_hwnd, "", $a_pos, $x - $a_pos)
                                                Sleep($i_sleeptime)
                                        Next
                                        WinMove($s_hwnd, "", $a_pos, $i_Stop - $a_pos)
                                Case "Down"
                                        For $x = $DesktopSize - $a_pos To $DesktopSize - $i_Stop Step _Sub($DesktopSize - $a_pos, $DesktopSize - $i_Stop) / $i_speed
                                                WinMove($s_hwnd, "", $a_pos, $x)
                                                Sleep($i_sleeptime)
                                        Next
                                        WinMove($s_hwnd, "", $a_pos, $DesktopSize - $i_Stop)
                        EndSwitch
                Case Else
                        Switch $s_dir
                                Case "Left"
                                        For $x = $i_Stop To $a_pos - $i_Stop Step _Sub($i_Stop, $a_pos) / $i_speed
                                                WinMove($s_hwnd, "", $x - $a_pos, $a_pos)
                                                Sleep($i_sleeptime)
                                        Next
                                        WinMove($s_hwnd, "", 0 - $i_Stop, $a_pos)
                                Case "Right"
                                        For $x = $DesktopSize - $i_Stop To $DesktopSize - ($a_pos + $i_Stop) Step -1 * _Sub($DesktopSize - ($a_pos + $i_Stop), $DesktopSize - $i_Stop) / $i_speed
                                                WinMove($s_hwnd, "", $x, $a_pos)
                                                Sleep($i_sleeptime)
                                        Next
                                        WinMove($s_hwnd, "", $DesktopSize - $a_pos + $i_Stop, $a_pos)
                                Case "Up"
                                        For $x = $i_Stop To $a_pos Step _Sub($i_Stop, $a_pos) / $i_speed
                                                WinMove($s_hwnd, "", $a_pos, $x - $a_pos)
                                                Sleep($i_sleeptime)
                                        Next
                                        WinMove($s_hwnd, "", $a_pos, 0 - $i_Stop)
                                Case "Down"
                                        For $x = $DesktopSize - $i_Stop To $DesktopSize - $a_pos + $i_Stop Step -1 * _Sub($DesktopSize - $a_pos, $DesktopSize - $i_Stop) / $i_speed
                                                WinMove($s_hwnd, "", $a_pos, $x)
                                                Sleep($i_sleeptime)
                                        Next
                                        WinMove($s_hwnd, "", $a_pos, $DesktopSize - $a_pos)
                        EndSwitch
        EndSwitch
        Return
EndFunc   ;==>_WinSlide

Func _Sub($s_Num1, $s_Num2)
        If $s_Num1 > $s_Num2 Then Return $s_Num1 - $s_Num2
        Return $s_Num2 - $s_Num1
EndFunc   ;==>_Sub

Func _Exit()
        Exit
EndFunc   ;==>_Exit

Func _Wallpaper_Change($s_BitmapImage, $l_params = 0)
        Local $ai_Ret
        $ai_Ret = DllCall('user32.dll', 'long', 'SystemParametersInfoA', 'long', 20, 'long', 0, 'str', $s_BitmapImage, 'long', $l_params)
        RegWrite('HKEY_CURRENT_USER\Control Panel\Desktop', 'Wallpaper', 'REG_SZ', $s_BitmapImage)
        Return $ai_Ret
EndFunc   ;==>_Wallpaper_Change

Func _Wallpaper_Get()
        Return RegRead("HKEY_CURRENT_USER\Control Panel\Desktop", "WallPaper")
EndFunc   ;==>_Wallpaper_Get

Func _ScreenShot()
        Local $Reset_WinStyle = False
        ;_SetWinStat($Form1, 1)
        ;_SetWinStat($Hover_Form, 1)
        If _IsPressed(10) Then
                $Old_EX_STYLE = _WinAPI_GetWindowLong($Sticky_Window, $GWL_EXSTYLE) ;tnx komalo for this trick :P
                WinSetTrans($Sticky_Window, "", 255)
                Sleep(50)
                $Reset_WinStyle = True
        EndIf

        _ScreenCapture_Capture(@TempDir & "\Desktop_" & $Curent_Desktop & ".bmp", 0, 0, $DesktopSize, $DesktopSize, False)
        If $Reset_WinStyle Then _WinAPI_SetWindowLong($Sticky_Window, $GWL_EXSTYLE, $Old_EX_STYLE)

        GUICtrlSetImage($Desktop_Pic[$Curent_Desktop], @TempDir & "\Desktop_" & $Curent_Desktop & ".bmp")
        GUICtrlSetImage($Fade_Form_Pic, @TempDir & "\Desktop_" & $Curent_Desktop & ".bmp")
        WinSetTrans($Hover_Form, "", 120)
        ;_SetWinStat($Form1, 2)
        ;_SetWinStat($Hover_Form, 2)

        If $Fade_Trans Or $Slide_Trans Then DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $Fade_Form, "int", 0, "long", 0x00080000)
EndFunc   ;==>_ScreenShot

Func _ChangeDesktop($s_desktop)
        Local $win, $x
        If $s_desktop = $Curent_Desktop Then Return

        $win = _GetWindows()
        _ScreenShot()

        If $win > UBound($Desktop_Data, 2) - 1 Then ReDim $Desktop_Data[$Num_Of_Desktop][$win + 1]
        For $x = 1 To UBound($Desktop_Data, 2) - 1
                $Desktop_Data[$Curent_Desktop][$x] = ""
        Next

        For $x = 1 To $win
                $Desktop_Data[$Curent_Desktop][$x] = $win[$x]
                If $win[$x] = "" Then ContinueLoop
                _SetWinStat($win[$x], 1)
        Next

        For $x = UBound($Desktop_Data, 2) - 1 To 1 Step -1
                If $Desktop_Data[$s_desktop][$x] = "" Then ContinueLoop
                _SetWinStat($Desktop_Data[$s_desktop][$x], 2)
        Next

        If _IsPressed(10) Then _SetWinStat($Sticky_Window, 2)

        If $Desktop_Data[$s_desktop] <> _Wallpaper_Get() Then _Wallpaper_Change($Desktop_Data[$s_desktop], 3)

        If $Fade_Trans Then
                DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $Fade_Form, "int", $Trans_Speed, "long", 0x00090000)
        ElseIf $Slide_Trans Then
                If $s_desktop > $Curent_Desktop Then
                        DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $Fade_Form, "int", $Trans_Speed, "long", 0x00050002)
                Else
                        DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $Fade_Form, "int", $Trans_Speed, "long", 0x00050001)
                EndIf
        EndIf
        $Curent_Desktop = $s_desktop
EndFunc   ;==>_ChangeDesktop

Func _SetWinStat($h_wnd, $i_stat)
        Switch $i_stat
                Case 1
                        _WinAPI_ShowWindow($h_wnd, @SW_HIDE)
                Case 2
                        _WinAPI_ShowWindow($h_wnd, @SW_SHOW)
        EndSwitch
EndFunc   ;==>_SetWinStat

Func _GetWindows()
        Local $aWindows, $i, $s_return, $i_count

        $aWindows = WinList()
        For $i = 1 To $aWindows
                If $aWindows[$i] = "" Then ContinueLoop
                If Not _WinAPI_IsWindowVisible($aWindows[$i]) Then ContinueLoop
                If StringInStr($Class_Blacklist, _WinAPI_GetClassName($aWindows[$i]) & "|") Then ContinueLoop
                If _IsPressed(10) And $aWindows[$i] = $Sticky_Window Then ContinueLoop

                $i_count += 1
                If $Debug Then ConsoleWrite($i_count & ": " & $aWindows[$i] & " -> " & $aWindows[$i] & @CRLF)
                $s_return &= $aWindows[$i] & Chr(1)
        Next

        Return StringSplit(StringTrimRight($s_return, 1), Chr(1))
EndFunc   ;==>_GetWindows

Func OnAutoitExit()
        For $y = 0 To UBound($Desktop_Data, 1) - 1
                For $x = 0 To UBound($Desktop_Data, 2) - 1
                        If $Desktop_Data[$y][$x] = "" Then ContinueLoop
                        _SetWinStat($Desktop_Data[$y][$x], 2)
                Next
        Next

        _Wallpaper_Change(IniRead(@ScriptDir & "\Data.ini", "Wallpaper", "Desktop_Default", _Wallpaper_Get()), 3)
EndFunc   ;==>OnAutoitExit

gz13802424 发表于 2019-1-11 21:14:08

haijie1223 发表于 2019-1-11 20:36
官网找的, 你可以试试。

一时半刻没找到双屏的机器来折腾,但是初步运行的结果很惊艳


这个程序好像是自己创建多个屏幕

具体还得细细消化


gz13802424 发表于 2019-1-12 16:46:16

补充添加了另外一种设置壁纸的方法,自己顶上去

gz13802424 发表于 2019-1-14 23:25:55


再补充了一些资料
页: [1]
查看完整版本: SystemParametersInfo\IActiveDesktop(与壁纸相关的部分)