Jak pozwolić użytkownikom wybrać domyślną drukarkę z listy drukarek?
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 pozwolić użytkownikom wybrać domyślną drukarkę z listy drukarek?
Cześć, Skrypciarze! Jak napisać skrypt logowania, umożliwiający wybranie domyślnej drukarki z listy drukarek zainstalowanych na komputerze?
-- JD
Cześć, JD. Każdy ma czasem takie jazdy, że chciałby zrobić coś dobrego dla swojego otoczenia, dla świata. Niestety nie trwa to długo i możemy uznać za sukces, jeżeli w przypływie entuzjazmu zrobimy chociaż dwa dobre uczynki. Bardzo szybko zdajemy sobie sprawę z tego, że świata nie da się uratować i po prostu się poddajemy. Jest jednak jeszcze grupa Skrypciarzy, która ,choćby nie wiem co się działo, zawsze – gdy tylko ma okazję – spełnia dobre uczynki, odpowiada na pytania zdesperowanych programistów, rozwiązuje problemy.
Skrypciarz piszący te słowa postanowił niezwłocznie odpowiedzieć na pytanie dotyczące ustawienia domyślnej drukarki i efektem tego postanowienia jest poniższy skrypt:
<SCRIPT Language="VBScript">
Sub Window_Onload
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")
For Each objPrinter in colPrinters
strPrinter = objPrinter.Name
Set objOption = Document.createElement("OPTION")
objOption.Text = strprinter
objOption.Value = strPrinter
AvailablePrinters.Add(objOption)
Next
End Sub
Sub SetDefault
strPrinter = AvailablePrinters.Value
Set WshNetwork = CreateObject("Wscript.Network")
WshNetwork.SetDefaultPrinter strPrinter
Msgbox strprinter & " has been set as your default printer."
End Sub
</SCRIPT>
<select size="5" name="AvailablePrinters"></select><p>
<input type="button" value="Set as Default" onClick="SetDefault">
Pomówmy o tym, co tutaj mamy; mamy aplikację HTA (aplikację HTML). Aplikacje HTA są dla osób piszących skrypty prostym sposobem na tworzenie graficznych interfejsów użytkownika; zasadniczo są to witryny internetowe (aczkolwiek z rozszerzeniem pliku .hta) stworzone do funkcjonowania na lokalnych komputerach. (Tak, wiemy, nie jest to wyczerpujące wyjaśnienie; więcej informacji na temat aplikacji HTA można znaleźć w centrum HTA Developers Center (j.ang.). VBScript nie dysponuje żadnym własnym sposobem na tworzenie interfejsów graficznych użytkownika. Jest to problem, jednak można go obejść tworząc właśnie aplikację HTA, a następnie wywołując ją za pomocą naszego skryptu logowania. I to jest dokładnie to, co tutaj zrobiliśmy: utworzyliśmy plik .hta, który musimy skopiować do każdego z naszych komputerów (To nie jest problem; nasz skrypt logowania to potrafi.) Wewnątrz naszego skryptu logowania potrzebne nam są dwa wiersze kodu do wywołania aplikacji HTA i umożliwienia użytkownikowi wyboru domyślnej drukarki:
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "C:\Scripts\Test.hta"
Co zatem zobaczymy, gdy wyskoczy aplikacja HTA? Zobaczymy – i to w całym blasku – coś, co wygląda następująco:
Tak, wiemy. Ale jeżeli chcecie coś ładniejszego, radźcie sobie sami.
Kiedy już wiemy, o co chodzi w podstawowym scenariuszu, przyjrzyjmy się bliżej samej aplikacji HTA. Jeżeli chodzi o znaczniki HTML, no cóż, wiele na ten temat powiedzieć się nie da: jedyne, co mamy, to okno o nazwie AvailablePrinters (dodane do HTA za pomocą znacznika <SELECT>) oraz przycisk (<INPUT TYPE = "BUTTON">):
<select size="5" name="AvailablePrinters"></select><p>
<input type="button" value="Set as Default" onClick="SetDefault">
Chodzi o to, że wybieramy drukarkę z okna listy, a następnie klikamy ten przycisk; kiedy to wykonamy, wybrana drukarka zostanie ustawiona jako nasza drukarka domyślna.
Właśnie tak: jak w bajce.
Jeżeli trochę się znamy na znacznikach, to zauważymy, że według ustawień nasze pole listy jest puste; nie ma w nim ani jednej zainstalowanej drukarki. Dlaczego? Pamiętajmy, że przede wszystkim potrzebujemy tutaj dynamicznego pola listy – takiego, które przy każdym uruchomieniu aplikacji HTA zapełni się drukarkami (i tylko tymi drukarkami) zainstalowanymi na danym komputerze. Jak mamy zamiar tego dokonać? Stosując poniższą procedurę, rzecz jasna:
Sub Window_Onload
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")
For Each objPrinter in colPrinters
strPrinter = objPrinter.Name
Set objOption = Document.createElement("OPTION")
objOption.Text = strPrinter
objOption.Value = strPrinter
AvailablePrinters.Add(objOption)
Next
End Sub
Chyba nie ma potrzeby wspominać, że ta procedura nosi nazwę Window_Onload; w aplikacji HTA (lub w witrynie internetowej) każda procedura o tej nazwie uruchamia się automatycznie, kiedy tylko aplikacja HTA zostaje otwarta lub odświeżona. Wewnątrz tej procedury używamy najpierw poniższego fragmentu kodu w celu uzyskania kolekcji wszystkich drukarek zainstalowanych na lokalnym komputerze:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")
To było całkiem proste, prawda? Teraz zostaje kwestia, co zrobić z tą kolekcją drukarek? Na początek, uruchamiamy pętlę For Each, która przejdzie przez każdą drukarkę w kolekcji. Dla każdej drukarki pobieramy wartość właściwości Name i zachowujemy ją z w zmiennej o nazwie strPrinter. Następnie stosujemy od razu poniższy wiersz kodu:
Set objOption = Document.createElement("OPTION")
Tworzymy teraz wystąpienie obiektu HTML Option. Jak nazwa wskazuje, obiekt ten reprezentuje pojedynczą opcję w polu listy. Po utworzeniu „pustej” opcji przypisujemy nazwę drukarki do właściwości opcji Text oraz właściwości Value:
objOption.Text = strPrinter
objOption.Value = strPrinter
Na wypadek, gdybyśmy się zastanawiali, właściwość Text reprezentuje właściwy tekst wyświetlony w polu listy; właściwość Value jest, no cóż, przypisana do tej opcji. Dla potrzeb naszego pola listy, właściwości Text i Value są identyczne, ale nie musi tak być. Na przykład, załóżmy, że mamy pole listy pozwalające wybrać dowolny stan w USA. Moglibyśmy ustawić właściwość opcji Text na Washington; w ten sposób ludzie widzieliby nazwę Washington w polu listy. Jednocześnie, moglibyśmy ustawić wartość opcji na WA. W ten sposób, nazwa widoczna w polu listy byłaby bardziej „przyjazna”, ale w dalszym ciągu moglibyśmy używać oficjalnego skrótu pocztowego w naszym skrypcie.
Przypisawszy wartości właściwości wywołujemy metodę Add i dodajemy opcję (tj. nazwę pierwszej drukarki) do pola listy:
AvailablePrinters.Add(objOption)
Następnie powtarzamy ten proces dla następnej drukarki w kolekcji. Procedura Window_Onload zapełnia nasze pole listy nazwami wszystkich drukarek zainstalowanych na lokalnym komputerze. Aby uczynić jedną z tych drukarek drukarką domyślną, musimy zaznaczyć ja na liście, a następnie kliknąć przycisk Set as Default. Kliknięcie tego przycisku spowoduje uruchomienie następującej procedury:
Sub SetDefault
strPrinter = AvailablePrinters.Value
Set WshNetwork = CreateObject("Wscript.Network")
WshNetwork.SetDefaultPrinter strPrinter
Msgbox strPrinter & " has been set as your default printer."
End Sub
Jak widać, nie dzieje się w tej procedurze nic szczególnie skomplikowanego. Na początek pobieramy właściwość Value z zaznaczonego elementu w polu listy i przypisujemy ją do zmiennej o nazwie strPrinter:
strPrinter = AvailablePrinters.Value
Stosujemy poniższe dwa wiersze kodu w celu utworzenia wystąpienia obiektu Wscript.Network i wywołujemy metodę SetDefaultPrinter, aby ustawić zaznaczoną drukarkę jako domyślną:
Set WshNetwork = CreateObject("Wscript.Network")
WshNetwork.SetDefaultPrinter strPrinter
Następnie, na zakończenie, wyświetlamy wiadomość informującą o tym, że wybrana drukarka jest teraz drukarką domyślną.
To w zasadzie wszystko, co musimy zrobić. Co prawda, nie mamy tu do czynienia z rozwiązywaniem problemów, ani nie mamy sposobu na zamknięcie okna dialogowego bez wybierania nowej drukarki domyślnej. Moglibyśmy też niby dać czadu i np. wyświetlić nazwę nowej domyślnej drukarki w innym kolorze. Ale spójrzmy na to z innej strony: gdybyśmy odstawili całą robotę, ktoś mógłby się poczuć niepotrzebny, a tego przecież nie chcemy.
Do początku strony |