Posts mit dem Label Windows Scripting Host werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Windows Scripting Host werden angezeigt. Alle Posts anzeigen

Mittwoch, 26. März 2008

Word über Windows Scripting Host fernsteuern / Remote controlling Word with windows scripting host

Wer intensiv mit Word arbeitet weiss, dass es für fast alle Funktionen drei Möglichkeiten gibt, diese aufzurufen (OK, manchmal gibt es auch vier ;-) ).

Die drei Basiswege hierbei stellen die Menüs und Popup-Menüs, die Maus und die Tastatur dar.

An dieser Stelle soll es sich um die eingebetteten Tastaturfunktionen drehen. Die meisten dieser Schnelltasten (Shortcuts) werden im übrigen in den diversen Menüs und Untermenüs an deren rechtem Rand angezeigt.

Wer sich nicht durch die Objekthierarchien von Word zwecks OLE Automation durcharbeiten möchte, kann mit Hilfe der Schnelltasten viele Funktionen von Word aufrufen. Das folgende Codebeispiel zeigt einige der Möglichkeiten auf. Letztlich passiert nicht wirklich viel, aber wir erhalten dadurch einen Eindruck der verfügbaren Möglichkeiten.

* Starte WinWord, übergebe einen String und sortiere ihn,
* dann starte Notepad und füge ihn ein


#DEFINE CRLF chr(13)+chr(10) && Wagenvorlauf und Zeilenvorschub (Carriage Return / Linefeed)
#DEFINE WSHIDE             0 && Versteckt das Fenster und aktiviert ein anderes
#DEFINE WSNORMAL           1 && Aktiviert und zeigt das Fenster
#DEFINE WSMIN              2 && Aktiviert und zeigt das Fenster im Minimieren-Modus
#DEFINE WSMAX              3 && Aktiviert und zeigt das Fenster im Maximieren-Modus
#DEFINE WSLAST             4 && Zeigt das Fenster im zuletzt benutzten Modus in Bezug auf Größe und Position an. Das aktive Fenster bleibt aktiv.
#DEFINE WSSAME             5 && Aktiviert das Fenster und zeigt es in aktuelle Größe und Position.
#DEFINE WSMINNEXT          6 && Minimiert das spezifizierte Fenster und aktiviert das nächte Top-Level-Fenster im Z-Order Stapel.
#DEFINE WSMINSAME          7 && Zeigt das Fenster im Minimiert-Modus. Das aktive Fenster bleibt aktiv.
#DEFINE WSSAMECUR          8 && Zeigt das Fenster im aktuellen Modus. Das aktive Fenster bleibt aktiv.
#DEFINE WSORIG             9 && Aktiviert und zeigt das Fenster
#DEFINE WSSETSHOW         10 && Setzt den Anzeigemodus basierend auf der aufrufenden Applikation.

DECLARE Sleep IN WIN32API INTEGER       && Millisekunden basierender Wartezyklus
                                        && dient zur besseren Veranschaulichung

_Cliptext = [Eins Zwei Drei Vier Fünf ]    && Basisstring definieren
_cliptext = STRTRAN(_Cliptext,[ ],CRLF)    && Leerzeichen durch CR/LF ersetzen

WshShell = CreateObject([wscript.Shell])


* Winword normal startenl
WshShell.Run([WinWord],WSNORMAL)
=Sleep(1000)

* STRG+v  - Zwischenablage einfügen
WshShell.SendKeys([^v])
=Sleep(1000)

* ALT+l+s - Sortiervorgang anstossen
WshShell.SendKeys([%ls])    && Word 2003
=Sleep(1000)

* ENTER   - Abfrage bestätigen
WshShell.SendKeys([{ENTER}])
=Sleep(1000)

* STRG+a  - alles markieren
WshShell.SendKeys([^a])
=Sleep(1000)

* STRG+c  - Markierung in die Zwischenablage kopieren
WshShell.SendKeys([^c])
=Sleep(1000)

* ALT+F4  - Winword Dokument schliessen
WshShell.SendKeys([%{F4}])
=Sleep(1000)

* n-(No)  - Speichern-Abfrage verneinen
WshShell.SendKeys([n])
=Sleep(1000)

* Notepad normal starten
WshShell.Run([notepad],WSNORMAL)
=Sleep(1000)

* Notepad aktivieren
WshShell.AppActivate([notepad])
=Sleep(1000)

* STRG+v  - Zwischenablage (jetzt sortiert) einfügen
WshShell.SendKeys([^v])


Freitag, 21. Dezember 2007

Erstellen einer Desktopverknüpfung unter VFP / Creating a desktop shortcut with VFP

Immer wieder besteht der Bedarf, bei einer Installation eine Desktopverknüpfung zu einer oder mehreren Dateien oder Applikationen zu erzeugen.

Professionelle Installer führen dies natürlich vollautomatisch für uns durch, aber hin und wieder müssen auch wir Entwickler solch eine Verknüpfung erzeugen.

Den einfachsten Weg stellt wie so oft der Windows Scripting Host bereit. Über 'CreateShortcut' können wir ein Verknüpfungsobjekt erzeugen, das diverse Eigenschaften bereitstellt, um eine Verknüpfung mit allen notwendigen Features zu erzeugen. Damit dies auch sauber funktioniert sind einige Schritte vorab durchzuführen.
  1. Auswählen der Datei oder Applikation zu der eine Verknüpfung erzeugt werden soll
  2. Einen sprechenden Namen für die Verknüpfung definieren. Hierdurch erscheint bspw. nicht 'notepade.exe' sondern 'Texteditor' als Verknüpfungsname auf dem Desktop.
  3. Der nun definierte Dateiname muss mit der Endung '.lnk' versehen werden.
Im Anschluß erzeugen wir ein ShortCut-Objekt und füllen es mit den gewünschten Eigenschaften.

* Beliebige Datei auf dem Deskop verknüpfen

* Arbeitsvariablen definieren
LOCAL cFileName as String, cLinkName as String, oShell as Object, ;
      cDesktop as String, oLink as Object

* Datei auswählen
cFileName        = GETFILE()
* ggf. alternative Bezeichnung für die Verknüpfung definieren
cLinkName        = INPUTBOX([Name: ],[Name der Verknüpfung],JUSTSTEM(cFileName))
* Dateinamenserweiterung 'lnk' erzwingen
cLinkName        = FORCEEXT(JUSTSTEM(cLinkName),[.lnk])
* Scriptinghost Object erzeugen
oShell           = CREATEOBJECT([WScript.Shell])
* Pfad für das lokale Desktop-Verzeichnis abfragen
cDesktop         = oShell.SpecialFolders([Desktop])
* Shortcutobject erzeugen
oLink            = oShell.CreateShortcut(ADDBS(cDesktop) + cLinkName)

WITH oLink
    * Darstellung - 3=Maximized  1=Normal  7=Minimized
    .WindowStyle        = 3
    * Zielverzeichnis
    .TargetPath         = cFileName
    * Ausführen in
    .WorkingDirectory   = ADDBS(JUSTPATH(cFileName))
    * Tastaturshortcut
    .Hotkey             = [Ctrl+Alt+m]
    * Tooltipp
    .Description        = [Demonstration eine Verknüpfung]
    *Objektverknüpfung erzeugen
    .Save()
ENDWITH

* Arbeitsvariablen freigeben
RELEASE cFileName, cLinkName, oShell, cDesktop, oLink

Donnerstag, 15. November 2007

Windows Scripting Host zur Abfrage von Laufwerksinformationen nutzen / Using Windows Scripting Host to query drive informations

Visual FoxPro bietet mit den Funktionen DISKSPACE() und DRIVETYPE() zwei Werkzeuge, die es uns ermöglichen, diverse Informationen bzgl. der verfügbaren Laufwerke abzufragen. Hier ein kleines Codemuster dazu: 
 
LOCAL laDrivetype(6), lcFont, i, lcL, j
laDrivetype(1) = [unbekannt ]
laDrivetype(2) = [Diskettenlaufwerk ]
laDrivetype(3) = [lokaler Datenträger]
laDrivetype(4) = [Netzlaufwerk ]
laDrivetype(5) = [CD/DVD-ROM Laufwerk]
laDrivetype(6) = [RAM Disk ]
lcFont = _screen.FontName
_screen.FontName = [Courier New]
CLEAR
?[LW Typ Gesamtgröße Freier Speicher]
FOR i = 65 TO 90
    lcL = CHR(i) + [:]
    IF DISKSPACE(lcL,1) > -1
        ? lcL,laDrivetype(DRIVETYPE(lcL))
        FOR j = 1 TO 2
            ?? [ ],TRANSFORM(DISKSPACE(lcL,j)/1000/1000,[999,999]) + [ MB]
            ?? [ ],PADL(ROUND(DISKSPACE(lcL,j)/1024/1024/1024,1),5,[ ]) + [ GB]
        ENDFOR
    ENDIF
ENDFOR
_screen.FontName = lcFont

Im Allgemeinen dürften diese Informationen ausreichend sein. Wenn wir jedoch weiterführende Daten benötigen (z.B. Dateisystem, Seriennummer, Datenträgerbezeichnung), dann streckt der Fux die Flügel. Zur Hilfe kommt uns wie so oft der Scripting Host. Also erstellen wir uns ein sogenanntes File System Object und fragen die benötigten Informationen ab. Wie dies bewerkstelligt wird, darüber gibt uns der folgende Code Aufschluss: 
 
LOCAL laDrivetype(6), lcFont, oFSO
laDrivetype(1) = [unbekannt]
laDrivetype(2) = [Wechseldatenträger]
laDrivetype(3) = [lokaler Datenträger]
laDrivetype(4) = [Netzlaufwerk]
laDrivetype(5) = [CD/DVD-ROM Laufwerk]
laDrivetype(6) = [RAM Disk]
lcFont = _screen.FontName
_screen.FontName = [Courier New]
oFSO = CREATEOBJECT([Scripting.FileSystemObject])

CLEAR

?PADR([LW], 3,[ ])
?? PADR([Typ], 21,[ ])
?? PADR([Dateisystem], 11,[ ])
?? PADL([SerialNo], 13,[ ])
?? [ ]
?? PADR([Datenträgerbezeichnung],33,[ ])
?? PADR([Gesamtgröße], 20,[ ])
?? PADR([Freier Speicher], 20,[ ])
?? PADR([Verfügbarer Speicher], 20,[ ])

FOR EACH oDrive IN oFSO.Drives
WITH oDrive
? PADR(.DriveLetter + [:],3,[ ])
?? PADR(laDriveType(.DriveType + 1),21,[ ])
IF .Isready
?? PADR(.FileSystem,11,[ ])
?? PADL(.SerialNumber,13,[ ])
?? [ ]
?? PADR(IIF(.DriveType = 3,.ShareName,.VolumeName),32,[ ])
?? TRANSFORM(.TotalSize / 1000 / 1000, [999,999]) + [ MB (]
?? PADL(.TotalSize / 1024 / 1024 / 1024,4,[ ]) + [ GB)]
?? TRANSFORM(.FreeSpace / 1000 / 1000, [999,999]) + [ MB (]
?? PADL(.FreeSpace / 1024 / 1024 / 1024,4,[ ]) + [ GB)]
?? TRANSFORM(.AvailableSpace / 1000 / 1000, [999,999]) + [ MB (]
?? PADL(.AvailableSpace / 1024 / 1024 / 1024,4,[ ]) + [ GB)]
ELSE
?? [kein Datenträger eingelegt]
ENDIF
ENDWITH
ENDFOR

_screen.FontName = lcFont
RELEASE laDrivetype, lcFont, oFSO

Mit Hilfe dieses kleinen Beispiels sollte es nun kein Problem mehr sein, die gewünschten Daten in Erfahrung zu bringen.