2009-04-14 10 views
1

Je construis un peu HTA pour un usage personnel, et voudrais pouvoir glisser et déposer un fichier à l'interface. Une fois le fichier supprimé, je l'exécute automatiquement (en supposant qu'il corresponde à certains paramètres définis, comme l'extension du fichier), ou au moins remplit la zone de saisie de l'interface HTA.Javascript - obtenir le chemin du fichier a chuté dans HTA

J'ai beaucoup cherché, mais je ne trouve pas de solution. Pensées?

Répondre

-2

Un HTA ne peut évidemment pas être la cible d'une opération de suppression de shell – au moins sur mon système, il est impossible de déposer quelque chose sur un HTA.

Cela impliquerait que vous ne pouvez pas directement faire ce que vous avez prévu. Un .vbs peut cependant être une cible de baisse.

Les chemins complets des fichiers déposés sont disponibles via la collection WScript.Arguments.Unnamed.

HTA a accès à ses arguments de ligne de commande via the commandLine Property. Cela signifierait que vous pourriez construire un petit utilitaire VBScript qui convertit les fichiers déposés en ligne de commande et appelle l'HTA pour vous.

Notez que vous ne pouvez pas supprimer des quantités infinies de fichiers sur un .vbs, et les lignes de commande ne sont pas illimitées non plus. Il y aura une limite de longueur dans la zone de quelques kB (je n'ai pas essayé de trouver exactement où la limite est, juste être prêt à faire face à une limite.)

+0

Merci pour la réponse! J'avais peur de ça. Je pense que je pourrais aller avec une interface Prism à une page HTML au lieu de l'HTA. – Joshua

+1

-1 "Un HTA ne peut évidemment pas être la cible d'une opération de suppression de shell" est (maintenant) incorrect. L'activation de la suppression sur un fichier HTA ou un raccourci implique une simple modification du registre, et c'est ce qui a toujours été le cas. Soutenir la chute sur une fenêtre HTA est maintenant simple avec HTML5. –

+0

C'est une belle addition, mais la deuxième réponse en ligne, que j'ai upvoted, dit exactement cela et je ne sais pas pourquoi elle n'a pas été acceptée. Tout le fil est à partir de 2009, donc vous êtes un peu en retard à la fête * et * apparemment vous n'avez pas lu passé cette réponse. Maintenant combinez cela avec le fait qu'il ne fonctionne en effet pas sur un système de vanille - comme celui que vous pourriez vouloir expédier votre HTA à ... vous avez l'idée. – Tomalak

5

Tomalak, est incorrect dans sa déclaration ... là est la façon de faire ce que vous voulez, sauf que vous devez ajouter le DropHandler dans le registre pour les fichiers HTA c'est vraiment facile à faire et une fois fait, vous serez en mesure de faire exactement ce que vous essayez de faire. Je n'ai pas trouvé beaucoup de documentation là-dessus, mais voici un lien vers un HTA écrit il y a longtemps par un gars nommé Michel Gallant, qui vous montre comment: http://www.jensign.com/JavaScience/www/wsh/imager/index.html

Lorsque l'HTA est lancé cherche à voir si le DropHandler est déjà configuré. Si vous ne le faites pas, il vous donne la possibilité de le configurer pour vous. Une fois configuré, tout ce que vous avez à faire est de fermer et de rouvrir le HTA et le wallah, là vous allez glisser et déposez le support dans les fichiers HTA.

+0

Nice. Je n'y ai pas pensé, mais vous avez bien sûr raison. – Tomalak

1

Si vous ne voulez pas activer le gestionnaire de dépôt, je pourrais imaginer un moyen que cela soit possible. C'est un peu une chaîne de comédie, mais je pourrais me voir mettre en œuvre si j'étais coincé dans un coin et avait besoin de cette fonctionnalité.

Vous pouvez créer un IFRAME dont le fichier src est situé dans un dossier temporaire. Ce dossier sera affiché en tant que vue Explorer. Vous pouvez ensuite faire glisser des fichiers dans celui-ci. Configurer une routine d'interrogation sur ce dossier pour voir s'il y a de nouveaux fichiers. Et voilà, vous avez un moyen infime de soutenir les opérations de glisser-déposer avec un fichier donné.

0

Allez et essayez google gears qui fournit glisser-déposer.

Vous pouvez même utiliser mysql dans hta.

Google Gears est pas disponible dans hta, cependant, vous pouvez créer le ActiveXObject dans un fichier html, puis d'inclure à l'aide d'un iframe(<iframe application="true" src=".."></iframe>)

Après cela, vous pouvez utiliser le activexobject à travers le iframe.

0

À propos de & hellip;

aimerait être en mesure de glisser-déposer un fichier sur le [HTA] Interface

& hellip; que j'interprète comme un désir de déposer des fichiers dans la fenêtre en cours HTA ’, plutôt que de déposer des fichiers sur le fichier HTA lui-même ou un raccourci vers celui-ci.

Avec HTML5, l'abandon lui-même est facile. Utilisez par exemple un élément <div> en tant que zone de dépôt. Pour cet élément gérer les événements dragenter, dragover et drop. Par exemple. le gestionnaire de dépôt peut ressembler à ceci:

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; 
} 

& hellip; où on_files_dropped est une fonction définie par vous qui gère une chute de fichiers.

Ajout des gestionnaires d'événements de manière dynamique en cas chargé de documents, peut ressembler à ceci:

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

Jusqu'à présent, si bon.

Cependant, la sécurité intervient avec une restriction: vous ne connaissez pas directement les chemins de fichier d'origine, seuls les noms de fichier et les tailles de fichier. Pour cette fonctionnalité est conçu pour le Web, pas pour les applications HTML locales de confiance. Donc, cela peut ou ne pas être nécessairement un problème.

  • Aux fins de l'utilisation d'un fichier déposé comme source pour un élément HTML, et en général pour la lecture d'un fichier déposé, HTML5 offre une FileReader (il y a un certain nombre de tutorials disponibles, quel lien suite à la documentation technique).

  • Lorsqu'un chemin local est nécessaire, par ex. Pour lire un fichier dans Windows Mediaplayer, vous pouvez supposer que l'opération de déplacement a commencé avec l'Explorateur Windows, maintenant aussi appelé Explorateur de fichiers, puis vérifiez simplement quelle fenêtre de l'Explorateur, le cas échéant, contient un fichier avec ce nom et cette taille.

Espérons que pas plus d'une telle fenêtre d'origine ne sera trouvée.

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; 
} 

Essentiellement que ’ s il. Sauf, peut-être, puisque les HTA par défaut à IE7, comment obtient-on la fonctionnalité HTML5. Eh bien peut-être par déclaration DOCTYPE, mais jusqu'à présent, dans ma petite expérimentation je viens d'utiliser les éléments suivants:

<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"> 

Cela vous donne le dernier moteur d'Internet Explorer, mais au prix d'aucun élément HTA, et donc pas d'accès direct à la ligne de commande. J'ai trouvé que the command line can be retrieved by running Windows’ wmic program, mais que ’ est un hack terrible. Ce problème entier, avec la plupart des routes apparemment ouvertes qui se révèlent être fermées, semble être une conséquence de Microsoft considérant maintenant HTA a legacy technology, to be quietly phased out in favor of fullscreen ad-ridden Windows 8 AppStore apps.

De toute façon, bonne chance!