Wertübergabe an HTA
Fischer
- programmiertechnik
2 Eternius2 Thomas Mell
Guten Tag! Ich habe beim Durchsuchen des Forums gesehen, daß sich einige Leute mit HTAs befassen, diese Frage ist aber leider nirgends aufgetaucht: Wie schaffe ich es, einer HTA-Applikation (z.B. aus einem Skript heraus) einen Wert zu übergeben?
Zum Hintergrund: Ich bin dabei, meine hauseigenen Rechner (Windows 95 bis Me; XP erst, wenn billig auf ebay) zu "verskripten". Es geht also nur um eine lokale Umgebung ohne Web, und es gibt - falls sich jemand Sorgen macht - auch keine schützenswerten Benutzer außer mir selber.
Ich habe dabei verschiedene eigene Dateitypen registriert. Bei einigen reicht es aus, sie von einem Skript aufrufen zu lassen:
[HKEY_CLASSES_ROOT\XYZDatei\shell\open\command]
@="wscript.exe C:\...\xyzSkript.js "%1" xyzParameter"
übergibt bei einem Doppelklick auf Datei.xyz den Pfad und Dateinamen sowie weitere Parameter an das Skript. Aber was mache ich nun, wenn das Skript in eine HTA eingebettet ist oder wenn es eine HTA aufrufen soll? Mit diesen Lösungsansätzen komme ich nicht recht weiter:
1. Befehlszeilenparameter
Ich sehe, daß HTAs folgendermaßen registriert sind:
[HKEY_CLASSES_ROOT\htafile\Shell\Open\Command]
@="C:\WIN9X\SYSTEM\MSHTA.EXE "%1" %*"
Ich muß zugeben, daß mir völlig schleierhaft ist, was das "%*" bedeuten soll. Googeln hat mir dabei auch nicht geholfen, kann aber auch an den Sonderzeichen liegen. Aber selbst wenn es möglich ist, MSHTA.EXE außer dem Pfad und Namen der HTA-Datei noch weitere Parameter zu übergeben, wie sollte ich sie dann in innerhalb der HTA auslesen? WScript.Arguments bringt nichts, weil das Skript nicht vom WSH gehostet wird, sondern von MSHTA bzw. IE.
var shell=new ActiveXObject("WScript.Shell") funktioniert bekanntlich in HTA-Dokumenten, var param=new ActiveXObject ("WScript.Arguments") (frech!!) funktioniert nicht.
2. Bekannte Techniken zur Wertübergabe zwischen HTML-Dateien
Es gibt ja einige schöne, in selfaktuell ausführlich diskutierte Tricks, Javascript-Variablen zwischen HTML-Dokumenten zu übergeben, die aber alle - soweit ich das sehe - mit HTAs scheitern. Es ist z.B. möglich, eine HTA fehlerfrei von der Konsole mit
mshta.exe "C:\xyz.hta?Wert"
zu laden, der "Wert" läßt sich aber nicht mit location.search auslesen. Ich weiß auch nicht, wie ich dem HTA-Fenster von vornherein und von "außen" einen bestimmten window.name zuweisen könnte. Kann es sein, daß Microsoft vergessen hat, MSHTA.EXE "scriptable" zu machen? Es gibt zwar eine "InternetExplorer.Application", aber offenbar keine "MSHTA.Application" (oder so ähnlich), mit der man vielleicht von einem Skript aus etwas erreichen könnte.
3. Umgebungsvariablen
Das einzige, was mir noch einfällt, ist, mit einem Skript eine Umgebungsvariable %htaparam% (oder so) zu erstellen und diese dann von einem Skript in der HTA wieder auszulesen. Das dürfte funktionieren, aber - - - das kann's doch nicht sein, oder?
Auf Antworten bin ich sehr gespannt!!
Hallo,
ich beunutze z.B. var cmd=[application].commandLine;
wobei application <HTA:APPLICATION ID="[application]"
entspricht. damit kannst du auf die aufrufende kommandozeile zugreifen.
so kannst du auch aus dem web parameter übergeben, du musst diese dann halt nur auseinander wurschteln (finde leider kein skript in meinem chaos, grad)
%1,%2,%3,%x 1,2,3,xter Parameter; %* alle parameter
gruss
Mann, was für schnelle Antworten! Das war genau das, wonach ich gesucht habe. Peinlich, habe ich in der Referenz völlig übersehen unter dem ganzen borderStylecontextMenushowInTaskBar-Geschwurbel. Das Auseinanderwurschteln ist auch kein Problem (lastIndexOf usw.)
Tausend Dank an euch beide!
Hallo nochmal! Wenn's interessiert, hier eine kleine Applikation, die von der Wertübergabe Gebrauch macht. Die REG-Datei fügt dem Kontextmenü von .js-Dateien (geht natürlich auch mit .vbs) den Menüpunkt "Erweitert ..." hinzu. Damit kommt man zu einem kleinen HTA-Fenster, mit dem man das betreffende Skript ausführen oder anzeigen/bearbeiten kann. Es ist auch möglich (darum das Ganze), das Skript mit Argumenten zu füttern, die man bequem in ein INPUT-Feld eingeben kann. Auf diese Weise spart man sich den lästigen Umweg über die Konsole.
Das Ganze ist fixfertig zu gebrauchen, nur die REG-Datei müßte natürlich an den Pfad der HTA auf der eigenen Festplatte angepaßt werden. Möglicherweise lautet unter Windows XP auch der HKCR-Eintrag für .js-Dateien ("JSFile") anders? Mit den alten Windows-Heim-Betriebssystemen sollte es auf jeden Fall so, wie es ist, funktionieren.
----- speichern als xyz.reg und ausführen ---------------------------
REGEDIT4
[HKEY_CLASSES_ROOT\JSFile\Shell\htaopen]
@="Erweitert ..."
[HKEY_CLASSES_ROOT\JSFile\Shell\htaopen\command]
@="mshta.exe "C:\...Pfad...\fks.hta" ?"%1""
---------------------------------------------------------------------
----- speichern als fks.hta -----------------------------------------
<html>
<head>
<HTA:APPLICATION ID="fk_hta"
APPLICATIONNAME="Skript"
BORDER="thin"
BORDERSTYLE="normal"
CAPTION="yes"
CONTEXTMENU="no"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="yes"
SCROLL="no"
SELECTION="no"
SHOWINTASKBAR="yes"
SINGLEINSTANCE="no"
SYSMENU="yes"
WINDOWSTATE="normal"
>
<!-- Fischer hats gemacht -->
<script type="text/javascript">
window.resizeTo(400,200);
window.moveTo(Math.floor((screen.availWidth-400)/2),Math.floor((screen.availHeight-200)/2));
var param=fk_hta.commandLine;
if (param.indexOf("?")>-1) param=param.substring(param.lastIndexOf("?")+1,param.length);
else { alert("HTA-Parameter fehlt!"); window.close(); }
</script>
<title>Skript</title>
<style type="text/css">
body { font-family:"News Gothic MT",sans-serif; cursor:default; font-size:11pt;
color:#D0D0D0; background-color:#0000FF; padding-top:10px; padding-left:10px; }
button { height:30px; width:100px; margin-right:18px; }
button.go { color:#000000; background-color:#D0D0D0; }
</style>
<script type="text/jscript" language="JScript">
var shell=new ActiveXObject("WScript.Shell");
function mach() { shell.Run(param+document.Formular.Text.value); }
function anzeige() { shell.Run(shell.ExpandEnvironmentStrings("%windir%")+"\Notepad.exe "+param); }
</script>
</head>
<body>
<script type="text/javascript">
function reset() { document.Formular.Text.value=""""; }
var text=param.toLowerCase().replace(/"/g,"");
text=text.substring(text.lastIndexOf("\")+1,text.length);
document.write("<p>Skriptdatei: "+text+"</p>");
</script>
<p><button type="button" class="go" onClick="mach()">Ausführen</button>
<button type="button" onClick="anzeige()">Anzeigen</button>
<button type="button" onClick="window.close()" style="margin-right:0px;">Schließen</button></p>
<form name="Formular" action=""><span style="margin-right:15px;" onClick="reset()"
title="Zurücksetzen">Parameter:</span><input name="Text" type="text" size="33"
value=""""></form>
</body>
</html>
---------------------------------------------------------------------
Vielleicht hat ja jemand Freude dran!
Liebe Grüße,
Fischer