2 Stimmen

Javascript - Pfad der in HTA abgelegten Datei ermitteln

Ich baue ein kleines HTA für den persönlichen Gebrauch, und möchte in der Lage sein, eine Datei auf die Schnittstelle zu ziehen und abzulegen. Sobald die Datei abgelegt ist, würde ich sie entweder automatisch ausführen (vorausgesetzt, sie entspricht einigen von mir festgelegten Parametern, wie z. B. der Dateierweiterung), oder zumindest das Eingabefeld auf der HTA-Schnittstelle ausfüllen.

Ich habe ausgiebig gesucht, kann aber keine Lösung finden. Was denken Sie?

5voto

mrTomahawk Punkte 904

Tomalak, ist falsch in seiner Aussage ... es gibt einen Weg zu tun, was Sie wollen, außer dass Sie die DropHandler in der Registrierung für HTA-Dateien hinzufügen müssen, ist es wirklich einfach zu tun und einmal getan werden Sie in der Lage sein, genau das zu tun, was Sie versuchen zu tun. Ich konnte nicht viel Dokumentation dazu finden, aber hier ist ein Link zu einer HTA, die vor langer Zeit von einem Typen namens Michel Gallant geschrieben wurde, der zeigt, wie man es macht: https://www.jensign.com/www/wsh/imager/

Wenn der HTA gestartet wird, prüft er, ob Sie den DropHandler bereits konfiguriert haben. Wenn nicht, gibt er Ihnen die Option, ihn für Sie zu konfigurieren. Nach der Konfiguration müssen Sie nur noch den HTA schließen und wieder öffnen und schon ist die Unterstützung für Drag & Drop in HTA-Dateien aktiviert.

1voto

Wenn Sie den Drop-Handler nicht aktivieren möchten, könnte ich mir eine Möglichkeit vorstellen, wie dies möglich sein könnte. Es ist ein bisschen wie eine Comedy-Kette, aber ich könnte mir vorstellen, dies zu implementieren, wenn ich in die Enge getrieben werde und diese Funktionalität brauche.

Sie können einen IFRAME erstellen, dessen src in einem temporären Ordner gespeichert ist. Dieser Ordner wird in einer Explorer-Ansicht angezeigt. Sie können dann Dateien dorthin ziehen. Richten Sie eine Abfrageroutine für diesen Ordner ein, um zu sehen, ob es neue Dateien gibt. Und voila, Sie haben eine lahme Methode, um Drag-and-Drop-Operationen mit einer bestimmten Datei zu unterstützen.

0voto

Tomalak Punkte 320467

Ein HTA kann natürlich nicht Ziel einer Granatenabwurf-Operation sein - zumindest auf meinem System ist es unmöglich, etwas auf einen HTA abzuwerfen.

Dies würde bedeuten, dass Sie nicht direkt tun, was Sie beabsichtigen.

Eine .vbs kann jedoch ein Ablageziel sein. Die vollständigen Pfade der abgelegten Dateien sind über die Option WScript.Arguments.Unnamed Sammlung.

HTA hat Zugriff auf seine Kommandozeilenargumente über die commandLine-Eigenschaft . Dies würde bedeuten, dass Sie ein kleines Hilfs-VBScript erstellen könnten, das die abgelegten Dateien in eine Befehlszeile übersetzt und den HTA für Sie aufruft.

Beachten Sie, dass Sie nicht endlos viele Dateien in einer .vbs ablegen können, und auch die Befehlszeilen sind nicht unbegrenzt. Es gibt eine Längenbeschränkung im Bereich von ein paar kB (ich habe nicht versucht, herauszufinden, wo genau die Grenze liegt, stellen Sie sich einfach auf eine Grenze ein).

0 Stimmen

Danke für die Antwort! Das hatte ich schon befürchtet. Ich denke, ich werde eine Prism-Schnittstelle zu einer HTML-Seite anstelle des HTA verwenden.

2 Stimmen

-1 "Ein HTA kann offensichtlich nicht Ziel einer Granatenabwurf-Operation sein" ist (jetzt) falsch. Das Ablegen auf einer HTA-Datei oder -Verknüpfung zu ermöglichen, erfordert eine einfache Änderung der Registry, und so war es schon immer. Die Unterstützung des Ablegens auf einem HTA-Fenster ist jetzt mit HTML5 einfach.

1 Stimmen

Das ist ein netter Zusatz, aber die zweite Antwort in der Reihe, die ich hochgestimmt habe, sagt genau das, und ich habe keine Ahnung, warum sie nicht akzeptiert wurde. Der ganze Thread stammt aus dem Jahr 2009, Sie sind also ein bisschen spät dran und Offensichtlich haben Sie diese Antwort nicht überflogen. Kombinieren Sie das nun mit der Tatsache, dass es tatsächlich nicht auf einem Vanilla-System funktioniert - wie dem, an das Sie Ihr HTA vielleicht schicken wollen... Sie verstehen schon.

0voto

greatghoul Punkte 1288

Probieren Sie Google Gears aus, das Drag & Drop ermöglicht.

Sie können sogar mysql in hta verwenden.

Google Gears ist in hta nicht verfügbar, aber Sie können das Activex-Objekt in einer HTML-Datei erstellen und es dann mit einem iframe(<iframe application="true" src=".."></iframe>)

Danach können Sie die activexobject durch die iframe .

0voto

Cheers and hth. - Alf Punkte 138555

Bezüglich

" eine Datei auf die [HTA]-Schnittstelle ziehen und dort ablegen können möchte "

was ich als Wunsch interpretiere, Dateien im laufenden Fenster von HTA abzulegen, anstatt Dateien auf der HTA-Datei selbst oder einer Verknüpfung dazu abzulegen.

Mit HTML5 ist das Ablegen selbst einfach. Verwenden Sie z.B. eine <div> Element als Ablagefläche. Behandeln Sie für dieses Element die Ereignisse dragenter , dragover y drop . Der Drop-Handler kann z.B. wie folgt aussehen:

function on_drop( e )
{
    e.preventDefault();  // stops the browser from redirecting off to the file
    var dt = e.dataTransfer

    var is_file_transfer = false;
    for( var i = 0; i < dt.types.length; ++i )
    {
        if( dt.types[i].toLowerCase() == 'files' )
        {
            is_file_transfer = true;
        }
    }
    if( !is_file_transfer )
    {
        return false;
    }
    on_files_dropped( dt.files );
    return true;
}

wo on_files_dropped ist eine von Ihnen definierte Funktion, die eine Dateiablage behandelt.

Das dynamische Hinzufügen von Ereignishandlern im Ereignis "Dokument geladen" kann wie folgt aussehen:

var dropbox = document.getElementById( 'blah' );
dropbox.addEventListener( 'dragenter', on_dragenter, false );
dropbox.addEventListener( 'dragover', on_dragover, false );
dropbox.addEventListener( 'drop', on_drop, false );

So weit, so gut.

Allerdings greift die Sicherheit mit einer Einschränkung ein: Sie erhalten keine direkte Kenntnis der ursprünglichen Dateipfade nur die Dateinamen und die Dateigrößen. Denn diese Funktion ist für das Web konzipiert, nicht für lokale, vertrauenswürdige HTML-Anwendungen. Es kann also ein Problem sein, muss aber nicht.

  • Für die Verwendung einer abgelegten Datei als Quelle für ein HTML-Element und generell für das Lesen einer abgelegten Datei bietet HTML5 eine FileReader (es gibt eine Reihe von Tutorials verfügbar, die weiterführende Links zur technischen Dokumentation enthalten).

  • Wenn ein lokaler Pfad erforderlich ist, z. B. für die Wiedergabe einer Datei im Windows Mediaplayer, können Sie annehmen dass der Ziehvorgang aus dem Windows-Explorer stammt, der jetzt auch Datei-Explorer genannt wird, und prüfen Sie dann einfach, ob und in welchem Explorer-Fenster eine Datei mit diesem Namen und dieser Größe vorhanden ist.

Es wird hoffentlich nicht mehr als ein solches Ursprungsfenster gefunden werden.

var shell   = new ActiveXObject( "Shell.Application" );
var fso     = new ActiveXObject( "Scripting.FileSystemObject" );

function possible_paths_for( filename )
{
    var windows     = shell.windows();      // Windows Explorer windows.
    var n_windows   = windows.Count;

    var lowercase_filename = filename.toLowerCase();
    var paths = Array();
    for( var i = 0; i < n_windows; ++i )
    {
        var url     = windows.Item(i).LocationURL;
        var path    = decodeURI( url.substr( 8 ) ).replace( /\//g, '\\' );
        // The path can be the path of this HTML application (.hta file), so:
        if( fso.FolderExists( path ) )
        {
            var folder  = fso.GetFolder( path );
            for( var it = new Enumerator( folder.Files ); !it.atEnd(); it.moveNext() )
            {
                var file = it.item();
                if( file.Name.toLowerCase() == lowercase_filename )
                {
                    paths.push( file.Path.toLowerCase() );
                }
            }
        }
    }
    return paths;
}

Das war's im Wesentlichen. Außer vielleicht, da HTAs standardmäßig auf IE7 eingestellt sind, wie bekommt man HTML5-Funktionalität. Nun kann durch Doctype-Deklaration, aber so weit in meinem kleinen Experimentieren ich nur die folgenden verwenden:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <!-- A windows web control defaults to quirky IE7 semantics. Request for better: -->
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta http-equiv="MSThemeCompatible" content="yes">

Damit erhalten Sie die neueste Internet Explorer-Engine, allerdings um den Preis, dass keine HTA Element und damit keinen direkten Zugriff auf die Befehlszeile. Ich fand das die Befehlszeile kann durch Ausführen von Windows'' abgerufen werden wmic Programm aber das ist ein furchtbarer Scherz. Dieser ganze Problembereich, bei dem sich die meisten scheinbar offenen Straßen als geschlossen herausstellen, scheint eine Folge davon zu sein, dass Microsoft jetzt HTAs in Betracht zieht a alte Technologie , wird schleichend zugunsten von werbefinanzierten Vollbild-Apps im Windows 8 AppStore abgeschafft .

Wie auch immer, viel Glück!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X