Jak losowo przypisać dźwięk do wydarzenia dźwiękowego?
Skrypciarze odpowiadają na Wasze pytania
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! Czy jest jakiś sposób na zapewnienie losowości wyboru plików .wav w momencie uruchomienia i zamykania systemu Windows?
-- DW
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 |