1 (изменено: Poltergeyst, 2019-04-08 15:53:55)

Тема: VBScript & COM: Установка обоев на Рабочий стол

Без гарантий. Используете на свой страх и риск.
Скрипт предназначен для установки обоев на Рабочий стол, и основан на вызове функций интерфейса IActiveDesktop средствами COM API. Чтобы установить новые обои, перетащите изображение GIF, JPG или BMP на значок скрипта.

Потребуется зарегистрированная библиотека scrsvc.dll(актуальная версия для этого скрипта 1.2.2)(желательно использовать самую последнюю, свежую выкладку).
ОС WinXP/7

SetWallpaper.vbs


 
 'Скрипт предназначен для установки обоев на Рабочий стол,
 'и основан на вызове функций интерфейса IActiveDesktop 
 'средствами COM API.

 'Чтобы установить новые обои, перетащите изображение GIF, JPG или BMP
 'на значок скрипта.
 
 'ОС WinXP/7

 Option Explicit
 '---------------------------------------------------------------
 Dim sWallPaperPath
 Dim oArgs
 Dim oScrSvc

 Set oArgs = WScript.Arguments
 If oArgs.Length = 0 Then
	MsgBox "Чтобы установить новые обои, перетащите изображение GIF, JPG или BMP на значок скрипта.", _
	vbExclamation + vbSystemModal, _
	"Reply"
	QuitMe()
 Else
 	sWallPaperPath = CStr(oArgs.Item(0))	
 End If

 '---------------------------------------------------------------
 Set oScrSvc = CreateObject("ScriptService.Service")

 'Интерфейс [IActiveDesktop]
 '---------------------------------------------------------------
 Const CLSID_IActiveDesktop = "{75048700-EF1F-11D0-9888-006097DEACF9}"
 Const UUID_IActiveDesktop = "{F490EB00-1240-11D1-9888-006097DEACF9}"

 'Методы интерфейса IActiveDesktop;
 Const ApplyChanges = 3
 Const GetWallpaper = 4
 Const SetWallpaper = 5
 Const GetWallpaperOptions = 6     
 Const SetWallpaperOptions = 7    
 Const GetPattern = 8          
 Const SetPattern = 9             
 Const GetDesktopItemOptions = 10 
 Const SetDesktopItemOptions = 11  
 Const AddDesktopItem = 12         
 Const AddDesktopItemWithUI = 13   
 Const ModifyDesktopItem = 14      
 Const RemoveDesktopItem = 15   
 Const GetDesktopItemCount = 16    
 Const GetDesktopItem = 17       
 Const GetDesktopItemByID = 18    
 Const GenerateDesktopItemHtml = 19
 Const AddUrl = 20               
 Const GetDesktopItemBySource = 21

 'Параметры установки обоев
 Const WPSTYLE_CENTER = 0
 Const WPSTYLE_TILE = 1
 Const WPSTYLE_STRETCH = 2
 
 Const CLSCTX_INPROC_SERVER = 1
 Const CC_STDCALL = 4
 Const S_OK = 0

 '/Выбор параметров установки/
 '---------------------------------------------------------------
 Dim i
 Dim r
 Dim GUID1, GUID2
 Dim pVarRes
 Dim pWALLPAPEROPT
 Dim VftPtr
 Dim IActiveDesktop, lData, p
 Dim pSetWallpaper, pApplyChanges, pSetWallpaperOptions

 Dim WPSTYLE_CHOICE
 Dim arr(4)
 Dim arr1(4)
 Dim arrRet

 arr(0) = "Центрировать"
 arr(1) = "Замостить"
 arr(2) = "Растянуть"

 arr1(0) = WPSTYLE_CENTER
 arr1(1) = WPSTYLE_TILE
 arr1(2) = WPSTYLE_STRETCH

 arrRet = oScrSvc.multi_dialog(arr)

 If Ubound(arrRet)=-1 Then QuitMe()
 If Ubound(arrRet) > 0 Then
	MsgBox "Допустим выбор только одного параметра.", vbExclamation + vbSystemModal, "Reply"
	QuitMe()
 End If

 For i=0 To UBound(arr)
	If StrComp(arrRet(0),arr(i)) = 0 Then WPSTYLE_CHOICE = arr1(i)
 Next

 '/Запрос интерфейса IActiveDesktop и вызов его функций/
 '---------------------------------------------------------------
 With oScrSvc

	'Выделение памяти
	'-------------------------------------------------------
 	GUID1 = .struct_setval(String(8,Chr(32)))		'8*2=16 итоговое количество байт
 	GUID2 = .struct_setval(String(8,Chr(32)))		'8*2=16 итоговое количество байт
 	pVarRes = .struct_setval(String(2,Chr(32)))		'2*2=4 итоговое количество байт
	pWALLPAPEROPT = .struct_setval(String(4,Chr(32)))	'4*2=8 итоговое количество байт
	'-------------------------------------------------------
 
		.set_vararg 0, 0
		.api_call "OLE32.DLL","CoInitialize", 1

	'Запрос интерфейса
	'-------------------------------------------------------
	.set_strarg 0, CLSID_IActiveDesktop, True	
	.set_vararg 1, GUID1
	r = .api_call("OLE32.DLL","CLSIDFromString",2)
	
	.set_strarg 0, UUID_IActiveDesktop, True
	.set_vararg 1, GUID2
	r = .api_call("OLE32.DLL","CLSIDFromString",2)

	.set_vararg 0, GUID1
	.set_vararg 1, 0
	.set_vararg 2, CLSCTX_INPROC_SERVER
	.set_vararg 3, GUID2
	.set_vararg 4, pVarRes
	r = .api_call("OLE32.DLL","CoCreateInstance",5)

	'-------------------------------------------------------
	IActiveDesktop = .struct_getval(pVarRes, 0, 4)
	
	'Получение адресов функций из vtable
	'-------------------------------------------------------
	VftPtr = .struct_getval(IActiveDesktop, 0, 4)

	pSetWallpaper = .struct_getval(VftPtr, 4 * SetWallpaper, 4)
	pApplyChanges = .struct_getval(VftPtr, 4 * ApplyChanges, 4)	
	pSetWallpaperOptions = .struct_getval(VftPtr, 4 * SetWallpaperOptions, 4)	

	'Вызов интерфейсных функций, установка обоев рабочего стола
	'-------------------------------------------------------
	'-------------------------------------------------------

	'----------- Выбор обоев
	.set_vararg 0, IActiveDesktop
	.set_vararg 1, .struct_setval(sWallPaperPath)
	.set_vararg 2, 0
	.api_direct_call pSetWallpaper, 3

	'----------- Установка параметров
	.struct_setval pWALLPAPEROPT, 8, 0, 4
	.struct_setval pWALLPAPEROPT, WPSTYLE_CHOICE, 4, 4

	.set_vararg 0, IActiveDesktop
	.set_vararg 1, pWALLPAPEROPT
	.set_vararg 2, 0
	.api_direct_call pSetWallpaperOptions, 3

	'----------- Применение изменений
	.set_vararg 0, IActiveDesktop
	.set_vararg 1, 7
	.api_direct_call pApplyChanges, 2
	'-------------------------------------------------------

		.api_call "OLE32.DLL","CoUninitialize",0


	'-------------------------------------------------------
	WScript.Sleep(50)
	MsgBox "Проверьте правильность установки обоев Рабочего стола.", vbInformation + vbSystemModal, "Reply"
	QuitMe()

 End With

 '/Проверка ошибки/
 '---------------------------------------------------------------
 Sub CheckResult(x, sSource)
	If x <> S_OK Then
		MsgBox "Сбой выполнения. Источник" & sSource, vbSystemModal + vbExclamation, "Error"
		QuitMe()
	End If
 End Sub

 '/Завершение работы/
 '---------------------------------------------------------------
 Sub QuitMe()
	Set oScrSvc = Nothing
	WScript.Quit()
 End Sub