Einbinden von Skripts in eine grafische Benutzeroberfläche Teil 1

Mit HTML-Anwendungen haben Sie die Möglichkeit, Skripts in eine grafische Benutzeroberfläche (GUI) einzubinden, die Kontrollkästchen, Optionsfelder, Dropdownlisten und alle anderen Windows-Elemente enthält, an die Sie sich gewöhnt haben. In diesem Artikel, dem ersten einer mehrteiligen Reihe, werden die Grundlagen der Erstellung Ihrer eigenen HTML-Anwendung beschrieben.

In diesem Beitrag

• Teil 1

Teil 2

Erstellen eigener HTML-Anwendungen: Erster Teil eines mehrteiligen Lernprogramms

Sie werden vielleicht bemerkt haben, dass MS-DOS seit längerem nicht mehr im Handel erhältlich ist, und das aus gutem Grund: Nachdem sich die Leute an Windows gewöhnt hatten, machte das Eingeben langer, komplizierter Befehle über die Eingabeaufforderung einfach nicht mehr so viel Spaß. Die Eingabeaufforderung erfüllt auch weiterhin ihren Zweck, doch der Erfolg von Windows (und Macintosh sowie sämtlichen Windows-ähnlichen Unix-Benutzeroberflächen) weist darauf hin, dass die Mehrheit der Benutzer eine grafische Benutzeroberfläche bevorzugt.

Demzufolge könnte eigentlich davon ausgegangen werden, dass bereits unzählige coole und schicke grafische UI-Widgets verfügbar sind, die auf Microsoft-Skripttechnologien wie Windows Script Host (WSH) und VBScript basieren. Dies ist jedoch seltsamerweise nicht der Fall. Abgesehen von einigen Meldungs- und Eingabefeldern bietet weder WSH noch VBScript besondere GUI-Elemente. Können Sie mit WSH oder VBScript ein Formular erstellen, in dem Sie Computernamen aus einem Listenfeld auswählen können? Nein. Können Sie ein Formular erstellen, in dem Optionen aus einer Reihe von Kontrollkästchen ausgewählt werden können? Nein. Können Sie – Nein, leider nicht. Wenn Sie eine grafische Benutzeroberfläche integrieren möchten, müssen Sie Skripts zurücklassen und sich komplexeren Programmiermethoden und -sprachen zuwenden.

Oder vielleicht doch nicht? Ziehen wir Folgendes in Betracht: Aus welchem Grund sind Skripts so attraktiv? Skripts ermöglichen eine schnelle und einfache Ausführung nützlicher Aufgaben, ohne dass Sie kompilieren oder ein leistungsfähigeres (und teureres) Tool als Editor dazu verwenden müssen. Angenommen, wir teilten Ihnen mit, dass Sie ein hilfreiches Dienstprogramm wie das Folgende auf schnelle und einfache Weise verwenden könnten, ohne zu kompilieren und ein leistungsfähigeres (und teureres) Tool als Editor einzusetzen:

Dn151209.3B693D151BD030596EE475CF5AB6ECDF(de-de,TechNet.10).png

Um das Bild in voller Größe anzuzeigen, klicken Sie hier.

Würde das Ihren Vorstellungen von einer grafischen Benutzeroberfläche entsprechen? Falls ja, heißen wir Sie in der Welt der HTAs willkommen.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).png Zum Seitenanfang

Was ist eine HTA?

HTA ist ein Akronym: es ist die Abkürzung für "HTML-Anwendung". Zu unseren Zwecken dient eine HTA ausschließlich dazu, eine grafische Benutzeroberfläche für Ihre Skripts zur Verfügung zu stellen. Wie wir bereits festgestellt haben, bietet weder WSH noch VBScript zufrieden stellende Elemente für eine grafische Benutzeroberfläche: keine Kontrollkästchen, keine Listenfelder und auch keine anderen Elemente. In Internet Explorer kommen all diese Elemente und weitere jedoch zur Verwendung. Da eine HTA auf Internet Explorer zurückgreift, können Sie beim Erstellen von Systemverwaltungsskripts alle verfügbaren GUI-Elemente verwenden. (Wir zeigen Ihnen natürlich genau, wie das geht.)

Welche Gemeinsamkeiten bestehen zwischen HTML-Dateien und HTAs? Zunächst können Sie bei einer beliebigen HTML-Datei die Endung von .htm (oder .html) in .hta ändern. Herzlichen Glückwunsch: damit haben Sie bereits Ihre erste HTA erstellt.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).png Zum Seitenanfang

Warum wird dann nicht einfach eine HTML-Datei verwendet?

Das ist leicht zu beantworten: aus Gründen der Sicherheit. Internet Explorer verfügt aus nachvollziehbaren Gründen über viele Sicherheitseinschränkungen: Wenn Sie eine Website besuchen, werden Sie es vermutlich vorziehen, wenn auf dieser Website kein clientseitiges Skript ausgeführt wird, das Ihre Einstellungen ändert oder das Dateisystem durchsucht. Daher schlagen viele Systemverwaltungsskripts, auch bei Verwendung von WMI oder ADSI, bei Ausführung in Internet Explorer entweder fehl oder im besten Fall wird ein Dialogfeld wie das Folgende angezeigt:

Dn151209.998573FC74D2F5DE79AB6744C075B56C(de-de,TechNet.10).png

Bei jeder Ausführung eines Skripts aus einer HTML-Datei wird ein solches Dialogfeld angezeigt. Das ist möglicherweise in Ordnung, jedoch nicht außerordentlich benutzerfreundlich.

Für HTAs gelten dagegen nicht dieselben Sicherheitseinschränkungen wie für Internet Explorer, denn HTAs werden in einem anderen Prozess als Internet Explorer ausgeführt. (HTAs werden im Prozess Mshta.exe, nicht im Prozess Iexplore.exe ausgeführt.) Im Gegensatz zu HTML-Seiten können HTAs clientseitige Skripts ausführen, und sie haben Zugriff auf das Dateisystem. Unter anderem bedeutet dies, dass HTAs Ihre Systemverwaltungsskripts ausführen können, auch solche, die WMI und ADSI verwenden. Die Skripts werden korrekt ausgeführt, und Sie erhalten keine Warnmeldungen über möglicherweise unsichere Elemente.

Selbstverständlich heißt das nicht, dass HTAs die Windows-Sicherheit in irgendeiner Weise umgehen. Wenn Sie beispielsweise keine Berechtigung zum Ändern eines Benutzerkennworts haben, können Sie das Kennwort auch nicht über ein Skript ändern. Es macht keinen Unterschied, ob Sie das Skript in eine HTA einfügen: Sie können das Kennwort weiterhin nicht ändern. Für HTAs gelten einige besondere Sicherheitseinschränkungen. Wir möchten uns hier noch nicht zu sehr in Details verstricken, daher beschränken wir uns auf folgende Bemerkung:

  • Obwohl HTAs Internet Explorer und das Internet Explorer-Objektmodell verwenden, werden sie in einem anderen Prozess als Internet Explorer ausgeführt. HTAs können daher Skripts und andere Aufgaben ausführen, die in Internet Explorer nicht zulässig sind.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).png Zum Seitenanfang

Das hört sich gut an! Wie erstelle ich so eine HTA?

Na, so ein Zufall: Dieser Artikel ist der erste in einer Reihe von Lernprogrammen, in denen Sie erfahren – Sie ahnen es schon – wie Sie eigene HTAs erstellen. (Was hätte jetzt auch sonst kommen sollen?) In diesem Monat stellen wir die Grundlagen der HTA-Erstellung vor. In den folgenden Artikeln werden wir uns mit fortgeschritteneren Themen befassen. Das könnte ganz lustig werden, oder?

Hinweis


Höre ich da etwa jemanden sagen: "Eine Reihe monatlich veröffentlichter Artikel dauert zu lange, ich möchte jetzt gleich alles über HTAs wissen!"? Das könnte etwas schwierig werden. Leider sind nicht allzu viele brauchbare Ressourcen für HTA-Anfänger verfügbar. Sie können immerhin das Tool HTA Helpomatic (in englischer Sprache) ausprobieren. Dort finden Sie verschiedene Codeausschnitte, die Sie in Ihre HTA kopieren können. Wenn Sie mehr Übung beim Erstellen von HTAs haben, sollten Sie The ABCs of HTAs (in englischer Sprache) besuchen.

Da wir gerade bei den Grundlagen sind, sollte wahrscheinlich gleich erwähnt werden, dass HTAs mit Editor oder einem beliebigen anderen Texteditor erstellt werden können. Da sehr viel HTML verwendet wird, könnte es jedoch sinnvoll sein, die HTAs in einem Webseiteneditor wie Microsoft FrontPage zu erstellen. Unabhängig davon können Sie eine reine Textdatei erstellen und diese mit der Erweiterung .HTA speichern. Eine rudimentäre, aber vollständige HTA könnte folgendermaßen aussehen:

<head>
<title>HTA Test</title>
<HTA:APPLICATION 
     APPLICATIONNAME="HTA Test"
     SCROLL="yes"
     SINGLEINSTANCE="yes"
     WINDOWSTATE="maximize"
>
</head>

<script language="VBScript">
    Sub TestSub
        Msgbox "Testing 1-2-3."
    End Sub
</script>

<body>
<input type="button" value="Run Script" name="run_button"  onClick="TestSub"><p> 

</body>

Keine Sorge, das Ganze ist nicht halb so kompliziert, wie es auf den ersten Blick scheint. In einer HTA lassen sich drei grundlegende Teile unterscheiden, auf die wir jeweils ausführlich eingehen:

  • Das <HTA:Application>-Tag
  • Das </script>-Tag
  • Das <body>-Tag

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Das <HTA:Application>-Tag

Sie können auch eine HTA erstellen, ohne das <HTA:Application>-Tag zu verwenden. Ihre HTA wird korrekt ausgeführt, und es ändern sich weder Funktionalität noch Leistungsfähigkeit.

Wenn es nicht notwendig ist, das <HTA:Application>-Tag zu verwenden, weshalb sollte man dies dann tun? (Hm, wenn Sie so fragen, hören Sie sich wirklich wie ein Skript-Kiddie an...) Jedenfalls bietet Ihnen das <HTA:Application>-Tag die Möglichkeit, das Erscheinungsbild Ihres HTA-Fensters zu steuern, indem Sie die verschiedenen Tag-Eigenschaften festlegen. Im Folgenden ist das in unserem Beispielskript verwendete <HTA:Application>-Tag aufgeführt:

<head>
<title>HTA Test</title>

<HTA:APPLICATION 
     APPLICATIONNAME="HTA Test"
     SCROLL="yes"
     SINGLEINSTANCE="yes"
     WINDOWSTATE="maximize"
>

</head>

Hinweis


Das <title>-Tag ist unabhängig vom <HTAApplication>-Tag. Es bezieht sich lediglich auf den Text, der in der Titelleiste des HTA-Fensters angezeigt wird. Wir zeigen dieses Tag hier nur, da sich der Titel normalerweise innerhalb des <head>-Tags befindet, an derselben Stelle wie das <HTA:Application>-Tag.

Wozu dient dieses Tag? Durch die Eigenschaft ApplicationName wird der Name der HTA festgelegt, der im Windows Task-Manager angezeigt wird. Wenn Sie keinen Anwendungsnamen angeben, wird im Task-Manager der Pfad zur HTA-Datei angezeigt. Durch Festlegen der Eigenschaft Scroll auf Yes werden automatisch Bildlaufleisten in der HTA angezeigt, wenn die zurückgegebenen Daten die Fenstergröße übersteigen. Durch die Einstellung No werden nur die Daten angezeigt, die in das Fenster passen. Durch die Eigenschaft SingleInstance wird sichergestellt, dass nur jeweils eine Instanz der HTA ausgeführt wird. Wenn Sie auf das HTA-Dateisymbol klicken, wird keine zweite Instanz der kleinen Anwendung gestartet.

Und zu guter Letzt WindowState: Bei Festlegung von WindowState auf maximize wird die HTA bei jedem Start im Vollbildmodus angezeigt.

Einige der interessanteren HTA-Eigenschaften sind in der folgenden Tabelle dargestellt.

Eigenschaft

Beschreibung

ApplicationName

Legt den Namen der HTA fest. Dieser Name wird verwendet, um die Eigenschaft SingleInstance zu erzwingen. Außerdem wird dieser Name im Windows Task-Manager angezeigt.

Border

Legt den Rahmentyp für das HTA-Fenster fest. Mögliche Werte sind thick (für ein Fenster mit änderbarer Größe) und thin (für ein Fenster mit fester Größe).

Caption

Mit dem Wert Yes bzw. No wird angegeben, ob eine Überschrift in der Titelleiste der HTA angezeigt wird. Der Standardwert ist Yes.

MaximizeButton

Mit dem Wert Yes bzw. No wird angegeben, ob die Schaltfläche Maximieren in der Titelleiste der HTA angezeigt wird. Der Standardwert ist Yes.

MinimizeButton

Mit dem Wert Yes bzw. No wird angegeben, ob die Schaltfläche Minimieren in der Titelleiste der HTA angezeigt wird. Der Standardwert ist Yes.

Scroll

Mit dem Wert Yes bzw. No wird angegeben, ob eine Bildlaufleiste angezeigt wird, wenn die zurückgegebenen Daten die Fenstergröße überschreiten. Der Standardwert ist Yes.

ShowInTaskbar

Mit dem Wert Yes bzw. No wird angegeben, ob die HTA in der Windows-Taskleiste angezeigt wird. Der Standardwert ist Yes.

SingleInstance

Mit dem Wert Yes bzw. No wird angegeben, ob mehrere Instanzen dieser HTA gleichzeitig ausgeführt werden können. Damit diese Eigenschaft wirksam wird, muss für ApplicationName ein Wert angegeben werden. Der Standardwert ist Yes.

SysMenu

Mit dem Wert Yes bzw. No wird angegeben, ob in der Titelleiste der HTA das Systemmenü angezeigt wird. Der Standardwert ist Yes.

WindowState

Legt die Anfangsgröße des HTA-Fensters fest. Mögliche Werte sind Normal, Minimize und Maximize. Der Standardwert für WindowState ist Normal.

In der folgenden Abbildung sind einige dieser Eigenschaften einem exemplarischen HTA-Fenster zugeordnet:

Dn151209.206B1B5F9BFBEB364B9AB66AC33D3749(de-de,TechNet.10).png

Um das Bild in voller Größe anzuzeigen, klicken Sie hier.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Das <script>-Tag

Obwohl es Ausnahmen gibt, werden viele VBScript-Skripts (d. h. VBS-Dateien) ausgeführt und anschließend beendet. Dies trifft wahrscheinlich auf 99 % der Skripts des Script Repository im Script Center zu. Was bedeutet, dass diese Skripts "ausgeführt und anschließend beendet" werden? Beim Starten der meisten VBScript-Skripts führt der Script Host Zeile 1 aus, anschließend (ohne Pause) Zeile 2, dann Zeile 3 usw. Nach Ausführung der letzten Zeile des Skripts werden das Skript und der Script Host-Prozess beendet, und die Party ist vorbei.

HTAs funktionieren dagegen gewöhnlich nicht auf diese Weise, da es sich bei HTAs um "ereignisgesteuerte" Anwendungen handelt. Im Allgemeinen geschieht beim Starten einer HTA zunächst nichts. Die HTA ist einfach nur da. Tatsächlich wird die HTA unendlich lange einfach nur da sein, und zwar so lange, bis ein Ereignis eintritt, auf das die HTA programmgemäß reagiert. Normalerweise ist das der Fall, wenn jemand auf eine Schaltfläche klickt, ein Element aus einer Dropdownliste auswählt oder eine ähnliche Aktion ausführt.

Hinweis


Wäre es möglich, eine HTA zu erstellen, die gleich nach dem Start automatisch eine Aktion ausführt? Sicher fügen Sie Ihren Code einfach in eine Unterroutine namens "Window_onLoad" ein. Wie der Name bereits sagt, wird diese Unterroutine automatisch nach jedem Laden oder Aktualisieren des HTA-Fensters ausgeführt. Mit dem folgenden Code wird z. B. bei jedem Starten der HTA automatisch die Unterroutine "TestSub" aufgerufen:
Sub Window_onLoad
TestSub
End Sub

Eine HTA ist kein großes, langes, durchgehendes Skript, das von Anfang bis Ende ausgeführt werden sollte, sondern besteht oftmals aus separaten und verschiedenen kleineren Skripts. Das eine Skript wird jedes Mal ausgeführt, wenn der Benutzer auf Schaltfläche A klickt, ein anderes bei jedem Klicken auf Schaltfläche B usw. Hat das Auswirkungen auf die Skripts, die in der HTA verwendet werden? Aber sicher.

Mindestens zwei Folgen fallen sofort ins Auge. Zunächst einmal müssen all diese separaten und unterschiedlichen Skripts in einem einzelnen <script>-Tag untergebracht werden, wie es bei HTML ja der Normalfall ist. Zweitens handelt es sich bei jedem "Skript" in Wirklichkeit um eine Unterroutine, die einen eindeutigen Namen besitzen muss. (Sie können Unterroutinen beliebig benennen, solange keine Leerzeichen oder andere ungültige Zeichen darin vorkommen. Weitere Informationen finden Sie im Abschnitt Procedures des Microsoft Windows 2000 Scripting Guide [in englischer Sprache].). Von nun an verwenden wir den Begriff Unterroutine für diese Codeblöcke, um den Code besser von demjenigen zu unterscheiden, der über das <script>-Tag ausgeführt wird.

Im Folgenden ein Beispiel für ein <script>-Tag, das nur eine Unterroutine enthält: TestSub. Weiter unten wird erklärt, wie diesem Tag weitere Unterroutinen hinzugefügt werden.

<script language="VBScript">
    Sub TestSub
        Msgbox "Test"
    End Sub
</script>

Im Prinzip ist das nicht besonders kompliziert: Denken Sie einfach daran, dass der gesamte Code in Unterroutinen enthalten sein muss und sich alle Unterroutinen innerhalb des <script>-Tags befinden müssen.

Okay, wir geben auf. Wenn HTAs nicht ausgeführt und dann automatisch beendet werden, wie wird eine HTA dann beendet? Am einfachsten ist es wahrscheinlich, auf die Schaltfläche Schließen des Fensters zu klicken. Natürlich können Sie eine HTA ohne eine Schaltfläche zum Schließen erstellen. Einen Artikel dazu finden Sie in ABCs of HTAs (in englischer Sprache). In einem solchen Fall können Sie zum Beenden einer HTA eine Unterroutine verwenden:

Sub ExitHTA
    self.close()
End Sub

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Das <body>-Tag

Wenn Sie jemals eine Webseite erstellt haben, wissen Sie vermutlich, dass sich im body-Bereich des Dokuments der Hauptteil der Informationen befindet: Text, Tabellen, Schaltflächen, Kontrollkästchen, horizontale Linien usw. Das gilt auch für HTAs. Beim Erstellen einer HTA beginnen Sie gewöhnlich oben mit dem <HTA:Application>-Tag, gefolgt vom <script>-Tag. An letzter Stelle steht das <body>-Tag. Innerhalb des <body>-Tags befinden sich die Elemente, die auf der Benutzeroberfläche der HTA angezeigt werden sollen. Die in der Beispiel-HTA verwendete Benutzeroberfläche ist sehr einfach: Sie besteht aus einer einzigen Schaltfläche mit der Beschriftung Run Script. Wie Sie sehen, befinden sich die HTML-Tags für die Schaltfläche zwischen den Tags <body> und </body>:

<body>
<input type="button" value="Run Script" name="run_button"  onClick="TestSub"><p> 

</body>

Ehrlich gesagt, ist das <body>-Tag recht langweilig. Das einzig interessante daran sind die Elemente innerhalb dieses Tags. In diesem ersten Artikel konzentrieren wir uns auf zwei dieser Elemente: Schaltflächen und <span>-Elemente. In den folgenden Artikeln wird es um weitere Elemente wie Kontrollkästchen, Options- und Listenfelder gehen.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Meine erste HTA

Wir wissen, was Sie denken: "Ja ja, Scripting Guys, wann kommen wir denn endlich zum interessanten Teil?" Warum nicht sofort? Die folgende Beispiel-HTA zeigt die auf dem lokalen Computer installierte Version des Betriebssystems an. Um diese HTA auszuprobieren, kopieren Sie den Code, fügen ihn in Editor ein und speichern die Datei mit der Erweiterung .hta (also z. B. "MeineErsteHTA.hta"). Dann doppelklicken Sie einfach im Arbeitsplatz oder in Windows Explorer auf das Dateisymbol, und es kann losgehen:

<head>
<title>Operating System Version</title>
<HTA:APPLICATION 
     APPLICATIONNAME="Operating System Version"
     SCROLL="yes"
     SINGLEINSTANCE="yes"
>
</head>

<script language="VBScript">

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

           Set colOperatingSystems = objWMIService.ExecQuery _
               ("Select * from Win32_OperatingSystem")

           For Each objOperatingSystem in colOperatingSystems
               Msgbox objOperatingSystem.Caption & " " & _
                   objOperatingSystem.Version
           Next
    End Sub
</script>

<body>
<input type="button" value="Operating System" name="run_button"  onClick="GetOSVersion">

</body>

Was geschieht, wenn Sie die HTA starten und auf die Schaltfläche Operating System klicken? Es sollte ein Meldungsfeld wie das Folgende angezeigt werden:

Dn151209.289B7093231268480ABD746ACC66ECC9(de-de,TechNet.10).png

Ja, schon klar. Aber irgendwo muss man ja anfangen, oder? Mit der Zeit kommen noch einige weitere Funktionen hinzu. Und machen Sie sich keine Sorgen, wenn Sie nicht verstanden haben, was wir hier gemacht haben. Gleich werden wir Sie schrittweise durch alle wichtigen Codezeilen führen. Zunächst jedoch ein kurzer Hinweis zur HTA-Ästhetik.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Unsere HTA soll schöner werden

Wir geben es zu: Im Moment sieht die HTA nicht besonders attraktiv aus. Können wir sie nicht ohne allzu großen Aufwand ein wenig ansprechender gestalten? Natürlich geht das, denn der HTA liegt im Kern schließlich einfach eine normale HTML-Seite zugrunde. Daher können wir versuchen, die HTA über den <body>-Tag etwas schöner zu gestalten. Wie wäre es zum Beispiel mit einem netten zyanfarbenen Hintergrund:

Dn151209.0FE391DB73E39E8ECC363596269C4FF1(de-de,TechNet.10).png

Sie haben es erfasst: so hübsch wie Paris Hilton. Die Hintergrundfarbe unserer HTA lässt sich einfach durch Hinzufügen eines bgcolor-Attributs innerhalb des <body>-Tags ändern. Hiermit wird die Hintergrundfarbe auf diesen atemberaubenden Zyanton festgelegt, der oben zu sehen ist:

<body bgcolor="cyan">

Es stehen viele weitere Farben zur Verfügung, die Sie neben Zyan verwenden können.

Wenn Sie ein Bild haben, das Sie für geeignet halten, können Sie für das background-Attribut auch den Namen der Bilddatei angeben:

<body background = "keyboard.jpg">

Je nachdem, wie "Keyboard.jpg" aussieht, erhalten Sie ein Ergebnis wie dieses:

Dn151209.E97E9882F16C3531286DEE2664C07051(de-de,TechNet.10).png

Cool, was? Denken Sie daran, dass Sie je nach Hintergrundfarbe möglicherweise auch die Schriftfarbe ändern sollten, doch darauf kommen wir später zurück. Solange wir noch beim Thema sind, können Sie auch das Attribut gradient background ausprobieren, dass unter "ABCs of HTAs" (in englischer Sprache) beschrieben ist. Das sieht recht cool aus und hat den Vorteil, dass keine JPG- oder eine andere Bilddatei erforderlich ist.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Hinzufügen einer Schaltfläche

Eines der Features, die in beinahe jeder HTA vorkommen, ist die gute alte Schaltfläche. Die HTA hat möglicherweise schicke Kontrollkästchen und Listenfelder oder andere Elemente zum Konfigurieren von Optionen und Festlegen von Einstellungen, an einem gewissen Punkt brauchen Sie jedoch etwas, um der HTA die Anweisungen zu übermitteln. In den meisten Fällen geschieht dies durch Klicken auf eine Schaltfläche.

Das Hinzufügen einer Schaltfläche zu einer HTA unterscheidet sich nicht vom Hinzufügen einer Schaltfläche zu einer HTML-Seite. Mit diesem Code wird der HTA z. B. eine Schaltfläche mit der Beschriftung Operating System hinzugefügt:

<input type="button" value="Operating System" name="run_button" onClick="GetOSVersion">

Wie Sie sehen, verwenden wir das <input>-Tag mit mehreren Attributen. Werfen wir einen Blick auf diese Attribute und ihre Funktion:

Attribut

Beschreibung

type

Gibt den Typ des <input>-Elements an, das auf der Seite platziert wird. Wie wir im nächsten Monat sehen werden, können mit dem <input>-Tag nicht nur Schaltflächen definiert werden.

value

"Value" (Wert) ist eine etwas irreführende Bezeichnung, da es hier um die Beschriftung der Schaltfläche geht. Wir erstellen in diesem Beispiel demnach eine Schaltfläche mit der Beschriftung Operating System.

name

Wie Sie vielleicht bereits erwartet haben, ist dies die eindeutige Bezeichnung der Schaltfläche. Weshalb benötigt die Schaltfläche einen Namen? Der Name ist nicht unbedingt erforderlich, sie können dieses Attribut auch weglassen. Wenn Sie den Schaltflächen jedoch Namen geben, können diese über Skripts konfiguriert und geändert werden. Sie können die Schaltflächen z. B. programmgesteuert aktivieren oder deaktivieren.

Wir greifen hier etwas voraus, doch mit dem folgenden Code wird eine Schaltfläche namens Run_Button konfiguriert:

Sub DisableButton
    Run_Button.Disabled = TRUE
End Sub

onClick

Der Name der Unterroutine, die bei jedem Klicken auf die Schaltfläche ausgeführt werden soll. Dieses Attribut ist optional. Sie können auch Schaltflächen erstellen, bei denen beim Klicken nichts geschieht. (Nein, nein – Schaltflächen, bei denen nichts geschieht, sind keine typischen Scripting Guys-Schaltflächen. Obwohl das vermutlich so sein könnte….)

Probieren Sie es selbst. Im Moment haben wir eine HTA mit einer einzelnen Schaltfläche. Wenn Sie auf die Schaltfläche klicken, gibt die HTA die auf dem lokalen Computer installierte Version von Windows zurück. Damit wird die Softwareindustrie zwar vermutlich nicht revolutioniert, es ist jedoch immerhin ein nicht vollständig sinnloses Programm. Nehmen wir nun an, wir möchten auch die Version des zuletzt auf dem Computer installierten Service Packs abrufen. Wir möchten dies weiterhin als separates Skript erstellen, sodass entweder die Betriebssystemversion oder die Service Pack-Version abgerufen werden kann. Wie erreichen wir das?

Wir könnten dazu eine zweite HTA mit einer einzelnen Schaltfläche erstellen, die nur diese eine Aufgabe erfüllt (das Abrufen der Service Pack-Version). Wahlweise könnten wir unserer ersten HTA auch einfach eine zweite Schaltfläche mit dem Namen service_pack und der Beschriftung (value) Service Pack hinzufügen, über die bei jedem Klicken eine Unterroutine namens GetServicePack ausgeführt wird. (Ja, wir wissen, dass eine solche Unterroutine nicht vorhanden ist. Darum werden wir uns noch kümmern.) Hier die Aufgabe: Versuchen Sie, der HTA eine zweite Schaltfläche hinzuzufügen und ein ähnliches Ergebnis wie dieses zu erhalten:

Dn151209.962955E24F5DD4A226415AC2011A5A03(de-de,TechNet.10).png

Die Lösung erfahren Sie hier nicht, zumindest nicht an dieser Stelle. (Sollten Sie Probleme bei der Umsetzung haben, klicken Sie hier.) Wir geben Ihnen den folgenden Hinweis: Versuchen Sie, den Code für die vorhandene Schaltfläche zu kopieren und entsprechend zu ändern.

Sie haben Recht: jetzt haben wir schon das Wichtigste verraten. Verdammt….

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Hinzufügen einer Unterroutine

Am Anfang dieses Artikels haben wir eine sehr einfache Unterroutine vorgestellt. Jetzt ist es an der Zeit für ein praxisnäheres Beispiel, und zwar die Unterroutine für unsere Betriebssystem-HTA. Beachten Sie, dass der Code der Unterroutine normaler WMI-Code ist. Mit einigen wenigen Ausnahmen, die den Windows Script Host betreffen (wir kommen in Kürze dazu), kann beinahe jeder Code, der in einem unabhängigen VBS-Skript ausgeführt wird, auch in einer HTA ausgeführt werden. Sie sollten (oder müssen) einige Änderungen vornehmen, um sicherzustellen, dass die Ausgabe richtig angezeigt wird. Die grundlegenden Codefunktionen, also das Herstellen einer Verbindung zum WMI-Dienst, das Ausführen der ExecQuery-Methode und die Schleife für die zurückgegebenen Daten, können jedoch übernommen werden.

Im Folgenden ein Beispiel für die Unterroutine. Beachten Sie, dass sie wie alle Unterroutinen zwischen den Tags <script> und </script> eingefügt wird:

<script language="VBScript">

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

           Set colOperatingSystems = objWMIService.ExecQuery _
               ("Select * from Win32_OperatingSystem")

           For Each objOperatingSystem in colOperatingSystems
               Msgbox objOperatingSystem.Caption & " " & _
                   objOperatingSystem.Version
           Next
    End Sub

</script>

Kann auch eine zweite Unterroutine hinzugefügt werden, die beim Klicken auf eine andere Schaltfläche ausgeführt wird? Das stellt kein Problem dar. Sie können innerhalb des <script>-Tags beliebig viele Unterroutinen einfügen. Stellen Sie dabei sicher, dass jede Unterroutine einen eindeutigen Namen hat und Sie die Anweisung End Sub verwenden, um das Ende jeder Unterroutine zu kennzeichnen. Hier ist ein Beispiel für eine sehr einfache Unterroutine mit dem Namen "MySecondRoutine", die wir in das <script>-Tag eingefügt haben:

<script language="VBScript">

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

           Set colOperatingSystems = objWMIService.ExecQuery _
               ("Select * from Win32_OperatingSystem")

           For Each objOperatingSystem in colOperatingSystems
               Msgbox objOperatingSystem.Caption & " " & _
                   objOperatingSystem.Version
           Next
    End Sub

    Sub MySecondRoutine
        Msgbox "This is my second subroutine."
    End Sub

</script>

Probieren Sie es selbst. Wenn Sie die letzte "Probieren Sie es selbst"-Übung durchgeführt haben, enthält Ihre HTA-Oberfläche jetzt eine zweite Schaltfläche, über die – theoretisch – die Version des zuletzt auf dem Computer installierten Service Packs abgerufen werden kann. Warum "theoretisch"? Im Moment ist zwar eine Schaltfläche vorhanden, die jedoch nicht mit einem Skript verknüpft ist, über das die Service Pack-Version abgerufen werden kann. Mal sehen, wie wir dies ändern können. Mit dem folgenden Skript wird die Version des zuletzt auf dem Computer installierten Service Packs ausgegeben:

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

Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")

For Each objOperatingSystem in colOperatingSystems
    Msgbox objOperatingSystem.ServicePackMajorVersion  _
        & "." & objOperatingSystem.ServicePackMinorVersion
Next

Probieren Sie, anhand dieses Codes der HTA eine Unterroutine namens GetServicePack hinzuzufügen. Wenn Sie die Unterroutine eingefügt haben, starten Sie die HTA, klicken auf die Schaltfläche Service Pack und überprüfen, ob die neue Unterroutine funktioniert. Wenn Sie damit Schwierigkeiten haben, klicken Sie hier.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Weshalb kann Wscript.Echo nicht verwendet werden?

Sie haben möglicherweise bemerkt, dass wir die VBScript-Funktion Msgbox anstelle der häufiger verwendeten Funktion Wscript.Echo verwendet haben, um die Betriebssystemversion zurückzugeben. Warum haben wir nicht Wscript.Echo verwendet? Hier der Grund:

Dn151209.A004779963B8EE9B5C0371FFA539BAA3(de-de,TechNet.10).png

Wie sich herausstellt, sind die verschiedenen Wscript-Methoden – "Wscript.Echo", "Wscript.Sleep", "Wscript.Quit" usw. – ausschließlich für die Ausführung in der Windows Script Host-Umgebung konzipiert. HTAs werden dagegen nicht unter WSH ausgeführt, sondern unter dem MSHTA-Prozess. Aus diesem Grund stehen die Wscript-Methoden für HTAs nicht zur Verfügung (und können auch nicht erstellt werden). Infolgedessen benötigen wir für jede Methode eine Problemumgehung, und "Msgbox" ist ein perfekter Ersatz für "Wscript.Echo". (Wir kommen später auf Problemumgehungen für andere Methoden wie "Wscript.Sleep" zurück, wenn diese benötigt werden.)

Die Moral der Geschichte: Kümmern Sie sich nicht um "Wscript.Echo", es wird nicht funktionieren.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Verwenden eines <span>-Tags

Bisher funktioniert unsere HTA einwandfrei: Sie klicken auf eine Schaltfläche, und es wird ein Meldungsfeld mit Informationen über das Betriebssystem bzw. das zuletzt auf dem Computer installierte Service Pack angezeigt. Sehr gut. Nehmen wir nun an, Sie möchten die Funktion hinzufügen, eine Liste aller auf dem Computer ausgeführten Prozesse anzuzeigen. Das ist nicht allzu schwer, abgesehen von einer Sache: Gegenwärtig werden auf dem Computer, der zum Schreiben dieses Lernprogramms verwendet wird, 49 Prozesse ausgeführt. Das ist ein Problem, denn wer möchte schon 49 Meldungsfelder erhalten, für jeden Prozess eins?

Wir sind nicht so anmaßend, "niemand" zu sagen, wagen aber doch die Behauptung, dass die meisten Benutzer es vorziehen, nicht 49 Mal auf OK klicken zu müssen. (47 oder 48 Mal vielleicht, aber 49 sind zuviel.) Also mal sehen. Wir müssen die Daten an einer anderen Stelle als in einem Meldungsfeld anzeigen, und in unserer HTA gibt es ziemlich viel freien Platz, der keinen speziellen Zweck hat. Hmm, das bringt uns auf eine Idee….

Hat gerade jemand gesagt, "Warum nicht die Daten in der HTA selbst anzeigen"? Eine gute Idee, die tatsächlich viel besser als unsere ist. Darin liegt einer der echten Vorteile einer HTA: Sie können nicht nur Daten in der Anwendung selbst anzeigen, sondern Sie können, wie Sie sehen werden, diese Daten auch formatiert anzeigen. Wie genau gehen wir dazu vor?

Tatsächlich gibt es mehrere verschiedene Möglichkeiten. Bei derjenigen, die wir für die am einfachsten zu programmierende halten, wird das <span>-Tag verwendet. Mit dem <span>-Tag können Sie einen Bereich in der HTA bestimmen und dann alle HTML-Elemente innerhalb dieses Tags programmgesteuert ändern. Was bedeutet das nun wieder? Speichern Sie den folgenden Code als HTA-Datei, führen Sie das Ganze aus, und klicken Sie dann auf die Schaltfläche Operating System:

<head>
<title>HTA Test</title>
<HTA:APPLICATION 
     APPLICATIONNAME="HTA Test"
     SCROLL="yes"
     SINGLEINSTANCE="yes"
>
</head>

<script language="VBScript">
    Sub GetOSVersion
        strComputer = "."
        Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

        Set colOperatingSystems = objWMIService.ExecQuery _
            ("Select * from Win32_OperatingSystem")

        For Each objOperatingSystem in colOperatingSystems
            DataArea.InnerHTML = objOperatingSystem.Caption & " " & _
                objOperatingSystem.Version
        Next

    End Sub
</script>

<body>
<input type="button" value="Operating System" name="run_button" onClick="GetOSVersion">
<p>
<span id = "DataArea"></span>
</body>

Ihr Bildschirm sollte in etwa wie folgt aussehen:

Dn151209.F97451347C229249D6FBFA78F2BC8A0F(de-de,TechNet.10).png

Sehen Sie? Kein Meldungsfeld – stattdessen werden die Daten in die HTA selbst geschrieben.

Für dieses erstaunliche Kunststück mussten wir nicht einmal unsere Seelen verkaufen, sondern nur zwei Dinge tun. Zunächst haben wir den <body>-Bereich geändert, sodass er jetzt ein <span>-Tag enthält (und wir haben eine ID für DataArea angegeben). Der geänderte <body>-Bereich sieht folgendermaßen aus:

<body>
<input   type="button" value="Operating System" name="run_button" onClick="GetOSVersion">
<p>
<span id = "DataArea"></span>
</body>

Die Schaltfläche ist auch weiterhin vorhanden, wir haben dem <body>-Tag jedoch zwei Elemente hinzugefügt. Zum einen ist das ein <p>-Tag, mit dem ein Abschnitt eingefügt wird, um einen Abstand zwischen der Schaltfläche und den anzuzeigenden Daten zu schaffen. Als zweites Element haben wir ein <span>-Tag mit der ID DataArea hinzugefügt:

<span id = "DataArea"></span>

Beachten Sie, dass das <span>-Tag leer ist. Zwischen dem öffnenden und dem schließenden Tag steht nichts. Nach Belieben kann hier ein Ausgangswert eingefügt werden. Das folgende geänderte Tag enthält einige Anweisungen für den Benutzer:

<span id = "DataArea">Click the button to return information about the operating system.</span>

Durch Klicken auf die Schaltfläche verschwinden diese Anweisungen und werden durch die von der Unterroutine GetOSVersion abgerufenen Informationen ersetzt.

Wie gehen wir dabei vor? Wie Sie sich vielleicht erinnern, haben wir in der ersten Version der HTA die Version des Betriebssystems abgerufen und diese Daten mithilfe der Funktion "Msgbox" angezeigt. Dazu haben wir folgenden Code verwendet:

Msgbox objOperatingSystem.Caption & " " & _
    objOperatingSystem.Version

Sehen Sie sich nun den geänderten Code an:

DataArea.InnerHTML = objOperatingSystem.Caption & " " & _
    objOperatingSystem.Version

Wir haben "Msgbox" hier ersetzt durch:

DataArea.InnerHTML =

InnerHTML ist eine Eigenschaft des <span>-Tags, die einfach auf alles verweist, was zwischen den Tags <span> und </span> steht, sei es Text, seien es HTML-Formatierungsangaben oder andere HTML-Tags. Wir legen hier lediglich die InnerHTML-Eigenschaft des <span>-Tags mit dem Namen DataArea auf die Betriebssystemversion fest. Und wenn wir aus unerfindlichen Gründen den Wert von InnerHTML auf "Keine Informationen verfügbar" setzen möchten? Dann würde der Code wie folgt aussehen:

DataArea.InnerHTML = "No information available."

Bei jeder Änderung des Werts der InnerHTML-Eigenschaft wird der alte Wert gelöscht und durch den neuen ersetzt.

Probieren Sie es selbst. Wenn Sie die Probieren Sie es selbst-Übungen durchgeführt haben, sollte Ihre HTA jetzt eine Schaltfläche mit dem Namen Service Pack enthalten. Durch Klicken auf diese Schaltfläche wird eine Unterroutine namens GetServicePack ausgeführt. Im Moment werden die von GetServicePack zurückgegebenen Informationen in einem Meldungsfeld angezeigt. Versuchen Sie, das <body>-Tag der HTA und die Unterroutine GetServicePack so zu ändern, dass die zurückgegebenen Informationen in die HTA selbst geschrieben werden (sagen wir, z. B. in einem <span>-Tag….). Sollten Sie Probleme bei der Umsetzung haben, klicken Sie hier.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Hat jemand von Formatierung gesprochen?

Ah ja. Diejenigen unter Ihnen, die das Schreiben von Skripts gewohnt sind, die in einem Befehlsfenster ausgeführt werden, haben möglicherweise vergessen, dass es Schriften in verschiedenen Größen, Stilen und Farben gibt. Wir werden hier nicht viele Worte zur Formatierung verlieren, es sei nur erwähnt, dass in HTML-Tags angegebene Formatangaben in die InnerHTML-Eigenschaft übernommen werden können. Angenommen, Sie erstellen eine normale Webseite und möchten einen Teil des Textes in Rot und der Schriftart Arial anzeigen. Wie würden Sie dazu vorgehen? Wahrscheinlich würde der Code in etwa so aussehen:

<font color='red' face='Arial'>No information available.</font>

Wie Sie sehen, befindet sich der Text zwischen den Tags <font> und </font>. Innerhalb des <font>-Tags haben wir den Attributen color (Farbe) und face (Schriftart) Werte zugeordnet. Das ist alles, ganz einfach.

Wie wird dieselbe Formatierung angegeben, wenn der InnerHTML-Eigenschaft ein Wert zugewiesen wird? Dazu wird genau dieselbe Syntax verwendet:

DataArea.InnerHTML = "<font color='red' face='Arial'>No information available.</font>"

Immer noch nicht zufrieden? Möchten Sie den Text auch noch fett formatieren? Dann fügen Sie einfach die Tags <b> und </b> hinzu:

DataArea.InnerHTML = "<b><font color='red' face='Arial'>No information available.</font></b>"

Wenn Sie die Textgröße ändern, den Text blinken lassen möchten (nicht zu empfehlen) oder eine der anderen Eigenschaften des Texts ändern möchten, fügen Sie einfach die entsprechenden HTML-Tags ein.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Anzeigen von Daten in mehreren Zeilen

Wie es bei uns Scripting Guys ab und zu vorkommt, sind wir etwas vom Thema abgeschweift: Drehte sich die ganze <span>-Geschichte nicht darum, dass die Namen aller ausgeführten Prozesse in der HTA angezeigt werden sollten? So ist es. Daher sollten wir uns dieser Aufgabe wieder zuwenden.

Sie ist nicht besonders schwierig, wenn auch ein wenig verzwickt. Warum? Angenommen, wir verwenden eine Unterroutine wie diese:

Sub GetProcesses

    strComputer = "."

    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process")

    For Each objProcess in colProcesses
        DataArea.InnerHTML = objProcess.Name
    Next

End Sub

Das sieht doch ziemlich gut aus, oder nicht? Das schon – unglücklicherweise funktioniert sie aber nicht. Wenn Sie diese Unterroutine ausführen, wird in der HTA nur ein Prozess angezeigt. Was ist mit den anderen 48 Prozessen geschehen?

Was geschehen ist: Wir haben die For Each-Schleife vermasselt, die die abzurufenden Prozesse durchläuft. Sehen Sie sich genau an, was in dieser Schleife passiert:

For Each objProcess in colProcesses
    DataArea.InnerHTML = objProcess.Name
Next

Bei jedem neu ermittelten Prozess wird InnerHTML auf den Namen dieses Prozesses festgelegt. Erinnern Sie sich an das, was wir über InnerHTML gesagt haben: Bei jeder Zuweisung eines neuen Werts zu InnerHTML wird der alte Wert, d. h. das, was zwischen den Tags <span> und </span> steht, überschrieben. Genau dies geschieht hier. Der Name des ersten Prozesses wird in InnerHTML übernommen, die Schleife wird erneut durchlaufen und der Name des zweiten Prozesses abgerufen. Anschließend wird dieser Wert in InnerHTML übernommen. Das ist auch soweit richtig, abgesehen davon, dass der vorhergehende Wert durch den neuen überschrieben wird. Dann geht es so weiter, bis der Name des letzten erfassten Prozesses übernommen wird, der – da er nicht überschrieben wird – als einziger angezeigt wird.

Nein, so geht das nicht. Nicht so schlimm, dieses Problem lässt sich recht einfach beheben. Der Trick besteht darin, die abgerufenen Prozessnamen nicht einzeln in die InnerHTML-Eigenschaft zu übernehmen. Stattdessen möchten wir erst die Namen aller Prozesse sammeln und anschließend, sobald die Liste vollständig ist, das Ganze in die InnerHTML-Eigenschaft übernehmen. Wir zeigen Ihnen die geänderte Unterroutine und erklären anschließend die Unterschiede. (Beachten Sie den Namen dieser neuen Unterroutine, wenn Sie mit Ausschneiden und Einfügen arbeiten. Der Prozess onClick muss entsprechend geändert werden. Außerdem erscheint es sinnvoll, den Namen der Schaltfläche in "Prozesse" oder ähnlich zu ändern)

Sub GetProcesses

    strComputer = "."

    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process")

    For Each objProcess in colProcesses
        strHTML = strHTML & objProcess.Name & "<br>"
    Next

    DataArea.InnerHTML = strHTML

End Sub

Es gibt zwei größere Unterschiede. Zunächst haben wir die For Each-Schleife grundlegend überarbeitet:

For Each objProcess in colProcesses
    strHTML = strHTML & objProcess.Name & "<br>"
Next

Beachten Sie, dass der Wert der InnerHTML-Eigenschaft nicht mehr festgelegt wird. Stattdessen wird bei jedem Durchlaufen der Schleife zum Abrufen der Prozesse eine Variable namens "strHTML" wie folgt zugewiesen:

  • Vorhandener Wert von strHTML
  • Name des Prozesses
  • HTML-Tag <br>

Weshalb? Wenn beim ersten Durchlaufen der Schleife ein Prozess namens "winword.exe" gefunden würde, hätte "strHTML" folgenden Wert:

winword.exe<br>

Wie kommen wir dazu? Dies ist der Wert der Variable "strHTML" (die beim ersten Ausführen der Schleife leer ist), gefolgt vom Namen des Prozesses (winword.exe) und einem <br>-Tag. Beim zweiten Durchlaufen der Schleife wird ein Prozess namens "outlook.exe" gefunden. Die Variable "strHTML" hat nun folgenden Wert:

winword.exe<br>outlook.exe<br>

Wieder wurde der vorhandene strHTML-Wert, winword.exe<br>, übernommen und der Name des nächsten Prozesses, outlook.exe, sowie ein weiteres <br>-Tag angehängt. Dies wird solange wiederholt, bis alle vorhandenen Prozesse abgerufen wurden.

Erst jetzt wird der InnerHTML-Eigenschaft ein Wert zugewiesen. Dieses Mal wird InnerHTML der Wert der Variable "strHTML" zugewiesen, bei dem es sich um eine Liste der Prozessnamen handelt. Folgender Code übernimmt diese Aufgabe:

DataArea.InnerHTML = strHTML

Bei Ausführung der HTA wird durch Klicken auf die Schaltfläche Processes die folgende Ausgabe angezeigt:

Dn151209.0346406FBFF11ED23A9A959493B1B187(de-de,TechNet.10).png

Das sieht schon besser aus.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Wozu dienen all die <br>-Tags?

Gute Frage. Denken Sie daran, dass wir es mit HTML zu tun haben, und in HTML gibt das <br>-Tag einen Zeilenumbruch an, enstprechend dem Drücken der EINGABETASTE in Editor. Wenn ein Element (z. B. ein Prozessname) in der nächsten Zeile angezeigt werden soll, muss lediglich ein <br>-Tag eingefügt werden. Nehmen wir an, wir hätten das <br>-Tag ausgelassen und würden folgende Unterroutine verwenden:

Sub GetProcesses

    strComputer = "."

    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process")

    For Each objProcess in colProcesses
        strHTML = strHTML & objProcess.Name
    Next

    DataArea.InnerHTML = strHTML

End Sub

Die Ausgabe bei Ausführung der Unterroutine sähe etwa so aus:

Dn151209.E50E8D160AB424F6F086329F36DAAC16(de-de,TechNet.10).png

Anstelle einer übersichtlichen Liste der Prozesse mit jeweils einem Prozess pro Zeile werden alle Prozesse in einer einzigen Zeile angezeigt (wobei die einzelnen Namen nicht einmal durch ein Leerzeichen voneinander getrennt sind). Aus diesem Grund müssen die Zeilenumbrüche manuell eingefügt werden, und dazu dienen all die <br>-Tags.

Ja, das war schon eine ziemlich dramatische Vorführung, oder etwa nicht?

Probieren Sie es selbst. Bisher haben wir einfach einen Eigenschaftswert, Name, der einzelnen auf dem Computer ausgeführten Prozesse abgerufen und ausgegeben. Probieren Sie, die Unterroutine so zu ändern, dass ein weiterer Eigenschaftswert, ProcessID, in derselben Zeile ausgegeben wird. Die fertige HTA sollte in etwa wie folgt aussehen:

Dn151209.B8EF4612D82CE4E244B936CFE8F2F7E9(de-de,TechNet.10).png

Wenn Probleme auftreten, klicken Sie hier.

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Anzeigen von Daten in einer Tabelle

Unsere vorhergehende HTA (aus der letzten Probieren Sie es selbst-Übung) zeigt den Wert zweier verschiedener Eigenschaften an. Die Ausgabe sieht doch ganz gut aus, und dank der beiden Striche ist es auch nicht allzu schwierig, herauszufinden, wo eine Eigenschaft aufhört und die andere beginnt. Was aber wäre, wenn vier oder fünf Werte in einer Zeile angezeigt werden sollen? Eine solche Ausgabe wäre etwas schwieriger zu entziffern:

Dn151209.DA0C189BCF25D17AFAA0AB6F5F4C71B6(de-de,TechNet.10).png

Wie lässt sich die Ausgabe übersichtlicher gestalten? Eine Möglichkeit besteht darin, die Informationen in einer Tabelle anzuzeigen. In diesem Monat werden wir nicht dazu kommen, Tabellen zu behandeln. Das müssen wir für eine andere Gelegenheit aufsparen. Als kleines Appetithäppchen stellen wir hier eine Variation unserer letzten Probieren Sie es selbst-Übung vor. Mit dieser Unterroutine werden sowohl der Prozessname als auch die Prozess-ID angezeigt, anders als in der ersten Version werden diese Informationen hier jedoch in einer zweispaltigen Tabelle angezeigt:

Sub GetProcesses

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & _
        "\root\cimv2")
    Set colProcesses = objWMIService.ExecQuery("Select * From Win32_Process")
    strHTML = "<table border='1' style='border-collapse: collapse' "  & _
        "bordercolor='#111111' width='100%' id='Table1' >"

    For Each objProcess in colProcesses
        strHTML = strHTML & "<tr>"
        strHTML = strHTML & "<td width='50%'>" & objProcess.Name & "</td>"
        strHTML = strHTML & "<td width='50%'>" & objProcess.ProcessID & _
            "</td>"
    Next

    strHTML = strHTML & "</table>"
    DataArea.InnerHTML = strHTML

End Sub

So sieht die HTA aus, nachdem die Unterroutine ausgeführt wurde:

Dn151209.DD7E832048488C783A460E53C3C860C2(de-de,TechNet.10).png

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Ausblick auf unsere nächste spannende Folge

In dieser ersten Stunde haben wir nur die Grundlagen der HTA-Erstellung vorgestellt. Trotzdem können Sie auch mit den hier vermittelten Kenntnissen schon ein sinnvolles kleines Programm erstellen. Im nächsten Monat werden wir unseren Horizont etwas erweitern und neue Elemente wie Kontrollkästchen, Optionsfelder und Dropdownlisten einführen. Das sollten Sie nicht verpassen!

Teil 2 der Reihe lesen

Dn151209.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

| Home | Technische Artikel | Community