Centrum skryptów - Centrum skryptów

Jak zmienić tapetę pulpitu, wybierając jedną z sześciu predefiniowanych pozycji?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak zmienić tapetę pulpitu, wybierając jedną z sześciu predefiniowanych pozycji?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak zmienić tapetę pulpitu, wybierając jedną z sześciu predefiniowanych pozycji?

-- SB

Cześć Skrypciarze! Odpowiedź

Cześć, SB. Kiedy Skrypciarz piszący te słowa zaczął się zastanawiać nad Twoim problemem, zdawało mu się, że wymyślił naprawdę świetne rozwiązanie. Skrypciarz ów niedawno czytał o niejakim Johannesie Trithemiusie, piętnastowiecznym benedyktynie, który jest jednym z ojców współczesnej kryptografii. Wszystko pięknie i ciekawie, ale uwagę Skrypciarza przykuł szczególnie system komunikacyjny, polegający na przekazywaniu wiadomości przez anioły. Takie rozwiązanie byłoby świetne – chcesz zmienić tapetę, a tu z nieba zlatuje anioł i robi to za ciebie. Świetny sposób zaimponowania szeregowym użytkownikom, nie?

Niestety jednak Skrypciarz piszący te słowa nie opracował metody przywoływania skrzydlatych aniołów. Dwa razy udało mu się wprawdzie przywołać skrzydłowych z Los Angeles Angels of Anaheim, ale ani jeden, ani drugi nie kwapił się, by zmieniać tapety na pulpicie. Może dlatego, że Skrypciarz piszący te słowa wcale ich o to nie prosił, zamiast tego nabijał się z nazwy ich zespołu.

Ale jednak Skrypciarz piszący te słowa dziwi się, że skrzydłowi nie zajęli się tym hobbystycznie. W końcu, kiedy zaczną się mistrzostwa, będą mieli mnóstwo wolnego czasu.

Uwaga. Skąd się wzięły te nagłe, wściekłe ataki na Aniołów? Tak naprawdę to znikąd, poza tym, że zespół ciągle zmienia nazwę, a Skrypciarz piszący te słowa nie może za tym nadążyć. Najpierw nazywali się Los Angeles Angels, potem California Angels, potem Anaheim Angels, a teraz Los Angeles Angels of Anaheim. Skrypciarz piszący te słowa doszedł do wniosku, że może się z nich śmiać bez oporów, bo do czasu opublikowania niniejszego artykułu zespół znowu zmieni nazwę, a gracze nawet się nie zorientują, że o nich mowa.

Tak czy inaczej, Skrypciarz piszący te słowa nie przekonał ani jednego anioła do pomocy w zmienianiu tapety pulpitu. Zadowolił się więc takim skryptem:

Const HKEY_CURRENT_USER = &H80000001



strComputer = "."



Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")



intLowNumber = 1

intHighNumber = 6



Randomize



intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)



Select Case intNumber

    Case 1

        strValue = "C:\WINDOWS\System32\Wallpaper1.bmp"

    Case 2

        strValue = "C:\WINDOWS\System32\Wallpaper2.bmp"

    Case 3

        strValue = "C:\WINDOWS\System32\Wallpaper3.bmp"

    Case 4

        strValue = "C:\WINDOWS\System32\Wallpaper4.bmp"

    Case 5

        strValue = "C:\WINDOWS\System32\Wallpaper5.bmp"

    Case 6

        strValue = "C:\WINDOWS\System32\Wallpaper6.bmp"

End Select



strKeyPath = "Control Panel\Desktop"

ValueName = "Wallpaper"



objReg.SetStringValue HKEY_USERS, strKeyPath, ValueName, strValue

Krótka uwaga, zanim wyjaśnimy, jak ten skrypt działa. Zmiana tapety nie jest tak naprawdę trudna: wystarczy przypisać ścieżkę tapety do odpowiedniej wartości rejestru (HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper). Jedyny problem polega na tym, że zmiana ta nie zachodzi natychmiast – użytkownik musi się najpierw wylogować i zalogować ponownie. (Dlaczego? Otóż, jeśli nie liczyć rozwiązań opracowanych przez inne firmy, nie istnieje niezawodny sposób, by odświeżyć ustawienia rejestru za pomocą skryptu.) Nie oznacza to, że nie można zmieniać tapety, a jedynie, że niemożliwe są dynamiczne zmiany, zachodzące w trakcie pracy użytkownika. W związku z tym, można ustawić omawiany skrypt jako skrypt wylogowania. Oznacza to, że skrypt uruchomi się po wylogowaniu użytkownika, który po ponownym zalogowaniu będzie miał już nową tapetę.

Tak czy inaczej, przyjrzyjmy się działaniu skryptu. Na początek definiujemy stałą o nazwie HKEY_CURRENT_USER, której przypisujemy wartość &H80000001; użyjemy jej, by wskazać, z którą gałęzią rejestru ma pracować skrypt. Następnie łączymy się z usługą WMI na komputerze lokalnym (chociaż można to zrobić także zdalnie), zwracając uwagę, by połączyć się z przestrzenią nazw root\default:

Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")

Teraz możemy losowo wybrać jedną z sześciu tapet. Trzeba przyznać, że tworzenie liczb losowych w VBScript jest nieco dziwne. Nasza rada brzmi: nie przejmuj się zanadto szczegółami. Wystarczy używać naszego szablonu – działa znakomicie.

Uwaga: Skrypciarz piszący artykuły z serii Sesame Script (których Skrypciarz piszący te słowa najwyraźniej nie czytuje) osobom zainteresowanym tworzeniem liczb losowym poleciłby ten artykuł swojego autorstwa (j.ang.). Ale dużo zabawniej byłoby zagrać w grę doktora Scripto (j.ang.).

Przypisujemy teraz dwóm zmiennym wartości odpowiadające najwyższej i najniższej liczbie z interesującego nas zakresu. Mamy sześć tapet do wyboru , więc interesuje nas zakres 1-6:

intLowNumber = 1

intHighNumber = 6

Następnie wywołujemy funkcję Randomize, łączącą generator liczb z bieżącym czasem systemowym. Czy to ważne? I to jak: bez funkcji Randomize skrypt za każdym razem generuje tę samą „losową” liczbę. Teraz za pomocą poniższego fragmentu kodu i funkcji Rnd wybieramy losową liczbę z zakresu 1-6:

intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)
Uwaga. Dokładna zasada działania tego kodu nie jest ważna. Aby generować liczby z innego zakresu, wystarczy wedle potrzeby zmieniać wartości intHighNumber i intLowNumber.

Zmienna intNumber zawiera w tym momencie jedną z następujących liczb: 1, 2, 3, 4, 5 lub 6. Chcąc przekształcić tę liczbę na tapetę pulpitu, użyjemy poniższego polecenia Select Case. Przypisujemy w nim zmiennej strValue ścieżkę dostępu zależną od wartości intNumber:

Select Case intNumber

    Case 1

        strValue = "C:\WINDOWS\System32\Wallpaper1.bmp"

    Case 2

        strValue = "C:\WINDOWS\System32\Wallpaper2.bmp"

    Case 3

        strValue = "C:\WINDOWS\System32\Wallpaper3.bmp"

    Case 4

        strValue = "C:\WINDOWS\System32\Wallpaper4.bmp"

    Case 5

        strValue = "C:\WINDOWS\System32\Wallpaper5.bmp"

    Case 6

        strValue = "C:\WINDOWS\System32\Wallpaper6.bmp"

End Select

Prawda, że proste? Jeśli intNumber jest równa jeden, to zmienna strValue otrzymuje wartość C:\WINDOWS\System32\Wallpaper1.bmp. Jeśli intNumber jest równa 2, to zmienna strValue otrzymuje wartość C:\WINDOWS\System32\Wallpaper2.bmp. I tak dalej.

Teraz już prawie skończyliśmy. Po przypisaniu zmiennej strValue ścieżki dostępu do tapety, używamy dwóch poniższych wierszy kodu, by przypisać wartości zmiennym oznaczającym odpowiedni klucz rejestru w gałęzi HKEY_CURRENT_USER (Control Panel\Desktop) oraz odpowiednią wartość rejestru wewnątrz tego klucza (Wallpaper):

strKeyPath = "Control Panel\Desktop"

ValueName = "Wallpaper"

Następnie wywołujemy metodę SetStringValue, za pomocą której zapisujemy zmiany w rejestrze:

objReg.SetStringValue HKEY_USERS, strKeyPath, ValueName, strValue

Rejestr zostanie zmieniony, ale, jak mówiliśmy, tapeta zmieni się aż do ponownego logowania użytkownika.

Johannes Trithemius oprócz wykorzystania aniołów jako kurierów, pracował także nad prostszymi rodzajami szyfrów i kodów. Jedną z takich technik jest steganografia, czyli ukrywanie tajnych wiadomości w zwyczajnym tekście. (Odszyfrowanie polegałoby np. na czytaniu co drugiej litery co drugiego słowa.) To, rzecz jasna, wywołuje ciekawe pytanie: czy Skrypciarze nie ukrywają czasem tajnych wiadomości w swoich artykułach?

Skrypciarzowi piszącemu te słowa trudno mówić za innych Skrypciarzy, ale jednego jest pewien: odnalezienie jakiejkolwiek wiadomości czy informacji w artykule z serii Cześć Skrypciarzu! z założenia musi być pomyłką.

 Do początku strony Do początku strony

Centrum skryptów - Centrum skryptów