Centrum Skrypciarzy - Systemy Operacyjne

Jak pozwolić użytkownikom wybrać domyślną drukarkę z listy drukarek?

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 pozwolić użytkownikom wybrać domyślną drukarkę z listy drukarek?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak napisać skrypt logowania, umożliwiający wybranie domyślnej drukarki z listy drukarek zainstalowanych na komputerze?

-- JD

Cześć Skrypciarze! Odpowiedź

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 Do początku strony

Centrum Skrypciarzy - Systemy Operacyjne