<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript & COM: Установка обоев на Рабочий стол]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=10462</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10462&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript & COM: Установка обоев на Рабочий стол».]]></description>
		<lastBuildDate>Sun, 01 Mar 2015 01:50:40 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[VBScript & COM: Установка обоев на Рабочий стол]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=92087#p92087</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em><br />Скрипт предназначен для установки обоев на Рабочий стол, и основан на вызове функций интерфейса IActiveDesktop средствами COM API. Чтобы установить новые обои, перетащите изображение GIF, JPG или BMP на значок скрипта.</p><p>Потребуется зарегистрированная библиотека <a href="http://forum.script-coding.com/viewtopic.php?id=8082">scrsvc.dll(актуальная версия для этого скрипта 1.2.2)</a>(желательно использовать самую последнюю, свежую выкладку).<br />ОС WinXP/7</p><p><strong>SetWallpaper.vbs</strong><br /></p><div class="codebox"><pre><code>
 
 &#039;Скрипт предназначен для установки обоев на Рабочий стол,
 &#039;и основан на вызове функций интерфейса IActiveDesktop 
 &#039;средствами COM API.

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

 Option Explicit
 &#039;---------------------------------------------------------------
 Dim sWallPaperPath
 Dim oArgs
 Dim oScrSvc

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

 &#039;---------------------------------------------------------------
 Set oScrSvc = CreateObject(&quot;ScriptService.Service&quot;)

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

 &#039;Методы интерфейса 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

 &#039;Параметры установки обоев
 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

 &#039;/Выбор параметров установки/
 &#039;---------------------------------------------------------------
 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) = &quot;Центрировать&quot;
 arr(1) = &quot;Замостить&quot;
 arr(2) = &quot;Растянуть&quot;

 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) &gt; 0 Then
	MsgBox &quot;Допустим выбор только одного параметра.&quot;, vbExclamation + vbSystemModal, &quot;Reply&quot;
	QuitMe()
 End If

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

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

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

	&#039;Запрос интерфейса
	&#039;-------------------------------------------------------
	.set_strarg 0, CLSID_IActiveDesktop, True	
	.set_vararg 1, GUID1
	r = .api_call(&quot;OLE32.DLL&quot;,&quot;CLSIDFromString&quot;,2)
	
	.set_strarg 0, UUID_IActiveDesktop, True
	.set_vararg 1, GUID2
	r = .api_call(&quot;OLE32.DLL&quot;,&quot;CLSIDFromString&quot;,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(&quot;OLE32.DLL&quot;,&quot;CoCreateInstance&quot;,5)

	&#039;-------------------------------------------------------
	IActiveDesktop = .struct_getval(pVarRes, 0, 4)
	
	&#039;Получение адресов функций из vtable
	&#039;-------------------------------------------------------
	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)	

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

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

	&#039;----------- Установка параметров
	.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

	&#039;----------- Применение изменений
	.set_vararg 0, IActiveDesktop
	.set_vararg 1, 7
	.api_direct_call pApplyChanges, 2
	&#039;-------------------------------------------------------

		.api_call &quot;OLE32.DLL&quot;,&quot;CoUninitialize&quot;,0


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

 End With

 &#039;/Проверка ошибки/
 &#039;---------------------------------------------------------------
 Sub CheckResult(x, sSource)
	If x &lt;&gt; S_OK Then
		MsgBox &quot;Сбой выполнения. Источник&quot; &amp; sSource, vbSystemModal + vbExclamation, &quot;Error&quot;
		QuitMe()
	End If
 End Sub

 &#039;/Завершение работы/
 &#039;---------------------------------------------------------------
 Sub QuitMe()
	Set oScrSvc = Nothing
	WScript.Quit()
 End Sub
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Sun, 01 Mar 2015 01:50:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=92087#p92087</guid>
		</item>
	</channel>
</rss>
