Centrum skryptów - Systemy operacyjne

Jak losowo przypisać dźwięk do wydarzenia dźwiękowego?

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 losowo przypisać dźwięk do wydarzenia dźwiękowego?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Czy jest jakiś sposób na zapewnienie losowości wyboru plików .wav w momencie uruchomienia i zamykania systemu Windows?

-- DW

Cześć Skrypciarze! Pytanie

Cześć, DW. Kiedy wczoraj wracałem do domu, zatrzymałem się na czerwonym świetle. (Co jest kolejną rzeczą odróżniającą mnie od innych mieszkańców przedmieścia w Seattle, niewielu z nich zatrzymuje się na czerwonym). No i kiedy tak sobie czekałem na zielone, rozejrzałem się dookoła i zauważyłem wielką tablicę, wywieszoną przed lokalną restauracją:

PIECZONY FILET Z KURCZAKA

PSTRĄG ZAPIEKANY W ZIOŁACH

KARMELOWA LATTE Z PARMEZANEM

Przyznajcie sami, że PIECZONY FILET Z KURCZAKA brzmi smakowicie i kusząco. PSTRĄG ZAPIEKANY W ZIOŁACH? Cóż, nie przepadam za rybami; tak naprawdę nie lubię niczego, co pływa. Ale mogę sobie wyobrazić, że miłośnicy ryb mogliby się na coś takiego skusić.

No i ten ostatni specjał: KARMELOWA LATTE Z PARMEZANEM. Nie widzicie w tym nic dziwnego?

Ja osobiście nigdy nie próbowałem KARMELOWEJ LATTE Z PARMEZANEM. Jestem absolutnie pewien, że nigdy nie próbowałem kawy latte o smaku jakiegokolwiek sera. Zdaję sobie sprawę, że ludzie pijają latte o bardzo dziwnych smakach: o smaku piwa korzennego oraz o smaku winogron. To te najbardziej niezwykłe, o których istnieniu wiem.

Nie próbowałem tej parmezanowej kawy, więc nie będę jej oceniał. Inna sprawa, że nie mam zamiaru nawet próbować kawy o smaku sera.

Jest jeszcze jedno wytłumaczenie. Zwykła pomyłka. Może ktoś po prostu coś pomieszał i na tablicy powinno być napisane co innego. Na przykład to:

PIECZONY FILET Z KURCZAKA

PSTRĄG ZAPIEKANY W ZIOŁACH Z PARMEZANEM

KARMELOWA LATTE

Ale sami przyznajcie, że wtedy nie byłoby w tym nic niezwykłego.

Czas chyba zająć się pracą, nieprawdaż? Jak się okazuje, informacje dotyczące dźwięków systemu przechowywane są w rejestrze. A dokładniej rzecz biorąc w tej części rejestru:

HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\Maximize\.Current. Każde z dźwiękowych zdarzeń, znajdujących się w Windows Control Pane (Domyślny sygnał dźwiękowy; Urządzenie podłączone; Urządzenie odłączone; itd.), ma swoje własne miejsce w kluczu rejestru:

Jak więc losowo przypisać dźwięk do jednego z tych zdarzeń? Zacznę od pokazania Wam skryptu przypisującego określony dźwięk do określonego zdarzenia. Następnie wyjaśnię, jak działa ten kod i zobaczymy, co możemy zrobić, żeby uzyskać losowe przypisywanie.

Oto prosty skrypt przypisujący plik dźwiękowy C:\Windows\Media\Ding.wav do zdarzenia dźwiękowego Maksymalizuj (innymi słowy, dźwięk Ding.wav będzie odgrywany przy każdym maksymalizowaniu okna):

Const HKEY_CURRENT_USER = &H80000001



strComputer = "."

 

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

 

strKeyPath = "AppEvents\Schemes\Apps\.Default\Maximize\.Current"

strValueName = ""

strValue = "C:\Windows\Media\Ding.wav"

 

objRegistry.SetExpandedStringValue _

    HKEY_CURRENT_USER,strKeyPath,strValueName,strValue

Jak widać, zaczynamy od zdefiniowania stałej o nazwie HKEY_CURRENT_USER i nadajemy jej wartość &H80000001. Ta stała informuje skrypt o tym, z którym kluczem rejestru mamy zamiar pracować. Po zdefiniowaniu stałej łączymy się z usługą WMI na lokalnym komputerze.

Uwaga! Czy moglibyśmy wykorzystać ten skrypt w celu zmiany dźwięków systemowych na zdalnym komputerze? Pewnie; wystarczy przypisać nazwę zdalnego komputera do zmiennej strComputer.

Teraz przypisujemy wartości do trzech zmiennych:

  • strKeyPath ścieżka do klucza rejestru, na którym będziemy pracować. W tym wypadku jest to AppEvents\Schemes\Apps\.Default\Maximize\.Current. Gdybyśmy chcieli zmienić dźwięk słyszany podczas zamykania systemu Windows, użylibyśmy tej ścieżki: AppEvents\Schemes\Apps\.Default\SystemExit\.Current. Chcąc zmienić dźwięk używany podczas uruchamiania systemu Windows, używamy tej ścieżki: AppEvents\Schemes\Apps\.Default\SystemStart\.Current. Etc.
  • strValueName. Jest to nazwa wartości rejestru, którą chcemy zmienić. Zauważcie, że nie określamy teraz nazwy. Dlaczego? Ponieważ wszystkie zdarzenia dźwiękowe wykorzystują wartości (Default) do zapisu informacji o dźwiękach.
  • strValue. To jest lokalna ścieżka do dźwięku, który chcemy słyszeć przy każdym maksymalizowaniu okna. Nawiasem mówiąc, informacje o dźwiękach są przechowywane za pomocą typu danych REG_EXPAND_SZ. Oznacza to, że moglibyśmy także użyć zmiennych środowiskowych w naszych ścieżkach, takich, jak %WINDIR% oraz %SYSTEMROOT%. Innymi słowy mogliśmy przypisać do zmiennej strValue tę wartość: %WINDIR%\Media\Ding.wav.

W tym momencie wystarczy wywołać metodę SetExpandedStringValue w celu zaktualizowania rejestru:

objRegistry.SetExpandedStringValue _

    HKEY_CURRENT_USER,strKeyPath,strValueName,strValue

Najlepsze w tym jest to, że zmiana następuje natychmiast i nie ma potrzeby wylogowywania się, ani zamykania systemu. Uruchamiamy natomiast skrypt i od razu próbujemy zmaksymalizować okno. Jeżeli nie usłyszycie żądanego dźwięku, to ja obiecuję, że zjem własny kapelusz.

A może nawet wypiję KARMEOLWĄ LATTE Z PARMEZANEM.

Nieźle, nie? Zastanówmy się teraz, jak losowo przypisać dźwięk do zdarzenia dźwiękowego. Cóż, następny skrypt pobiera kolekcję wszystkich plików w folderze C:\Windows\Media:

Set colFileList = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Windows\Media'} Where " _

        & "ResultClass = CIM_DataFile")

Następnie pobiera wartość właściwości Count, która mówi nam o tym, ile plików znajduje się w folderze Media:

intCount = colFileList.Count

Teraz skrypt stosuje następujący fragment kodu w celu wygenerowania losowego numeru z zakresu od 1 do liczby plików w folderze:

intHighNumber = intCount

intLowNumber = 1



Randomize

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

Macie to? OK, po przypisaniu wartości 1 do zmiennej licznika o nazwie i uruchamiamy pętlę For Each, która przejdzie przez wszystkie pliki w kolekcji. Wewnątrz tej pętli uruchamiany poniższy wiersz kodu w celu określenia, czy nasza zmienna licznika jest równa losowej liczbie, którą wygenerowaliśmy:

If i = intNumber Then

Jeżeli tak, pobieramy wartość właściwości Name (ścieżka) pliku, przypisujemy ją do zmiennej strValue i wykonujemy instrukcję Exit For w celu opuszczenia pętli For Each:

If i = intNumber Then

    strValue = objFile.Name

    Exit For

End If

Jeżeli nie, zwiększamy wartość o 1 i próbujemy jeszcze raz. Wcześniej czy później zmienna licznika będzie miała wartość intNumber i przypiszemy ścieżkę pliku do zmiennej strValue. Kiedy tak się stanie, możemy zastosować nasz oryginalny skrypt w celu przypisania tej wartości do zdarzenia dźwiękowego Maksymalizuj.

Oto jak wygląda cały nasz skrypt:

Const HKEY_CURRENT_USER = &H80000001



strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colFileList = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Windows\Media'} Where " _

        & "ResultClass = CIM_DataFile")



intCount = colFileList.Count



intHighNumber = intCount

intLowNumber = 1



Randomize

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



i = 1



For Each objFile in colFileList

    If i = intNumber Then

        strValue = objFile.Name

        Exit For

    End If   

    

    i = i + 1

Next



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

 

strKeyPath = "AppEvents\Schemes\Apps\.Default\Maximize\.Current"

strValueName = ""

 

objRegistry.SetExpandedStringValue _

    HKEY_CURRENT_USER,strKeyPath,strValueName,strValue

To powinno zadziałać, DW.

Gdybyście sami natknęli się na jakieś dziwne specjały oferowane przez znane Wam restauracje, koniecznie mi o tym napiszcie.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne