Javascript - получение пути файла, сброшенного в HTA - PullRequest
1 голос
/ 14 апреля 2009

Я создаю небольшой HTA для личного использования и хотел бы иметь возможность перетаскивать файл в интерфейс. После удаления файла я либо автоматически запустил его (при условии, что он соответствует некоторым заданным мной параметрам, например, расширению файла), либо, по крайней мере, заполнил поле ввода на интерфейсе HTA.

Я много искал, но не могу найти решение. Мысли

Ответы [ 5 ]

5 голосов
/ 16 апреля 2009

Томалак, неверен в своем заявлении ... есть способ сделать то, что вы хотите, за исключением того, что вы должны добавить DropHandler в реестр для файлов HTA, это действительно легко сделать, и когда вы это сделаете, вы сможете сделать точно что ты пытаешься сделать. Я не смог найти много документации по этому вопросу, но вот ссылка на HTA, которая была написана давным-давно парнем по имени Мишель Галлант, которая показывает вам, как это сделать: http://www.jensign.com/JavaScience/www/wsh/imager/index.html

Когда HTA запущен, он проверяет, настроен ли уже DropHandler. Если вы этого не сделаете, это даст вам возможность настроить его для вас. После того, как вы настроите все, что вам нужно сделать, это закрыть и снова открыть HTA и wallah, вы перейдете к поддержке перетаскивания в файлах HTA.

1 голос
/ 16 июля 2009

Если вы не хотите включать обработчик отбрасывания, я мог бы представить, как это возможно. Это что-то вроде комедийной цепочки, но я мог бы увидеть, как я реализую это, если бы меня загнали в угол и мне понадобились эти функции.

Вы можете создать IFRAME, где его src является временной папкой. Эта папка будет отображаться в виде проводника. Затем вы можете перетащить файлы в это. Установите процедуру опроса для этой папки, чтобы увидеть, есть ли новые файлы. И вуаля, у вас есть слабый способ поддерживать операции перетаскивания с данным файлом.

0 голосов
/ 01 апреля 2014

Относительно & hellip;

& ldquo; хотел бы иметь возможность перетаскивать файл в интерфейс [HTA] & rdquo;

& hellip; который я интерпретирую как желание сбрасывать файлы в HTA & rsquo; окно, а не удаление файлов в самом файле HTA или ярлык к нему.

С HTML5 само удаление легко. Используйте, например, элемент <div> как область перетаскивания. Для этого элемента обработайте события dragenter, dragover и drop. Например. обработчик сброса может выглядеть так:

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; где on_files_dropped - это определенная вами функция, которая обрабатывает удаление файлов.

Динамическое добавление обработчиков событий в событие загрузки документа может выглядеть следующим образом:

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

Пока все хорошо.

Однако безопасность вмешивается с ограничением: вы не получаете непосредственного знания об исходных путях файлов , только об именах файлов и размерах файлов. Для этого функционал предназначен для Интернета, а не для локальных доверенных приложений HTML. Так что это может или не может быть проблемой.

  • В целях использования отброшенного файла в качестве источника для элемента HTML и, как правило, для чтения отброшенного файла, HTML5 предоставляет FileReader (там доступно несколько учебных пособий , ссылки на которые приведены далее в технической документации.

  • Где необходим локальный путь, например для воспроизведения файла в Windows Mediaplayer вы можете предположить , что операция перетаскивания возникла из проводника Windows, теперь также называемого проводником файлов, а затем просто проверить, в каком окне проводника, если таковое имеется, содержится файл с таким именем и размер.

Надеюсь, будет найдено не более одного такого исходного окна.

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

По сути, это так. За исключением, может быть, поскольку HTA по умолчанию IE7, как получить функциональность HTML5. Ну, может, через объявление doctype, но пока в своих маленьких экспериментах я просто использую следующее:

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

Это дает вам новейший движок Internet Explorer, но за счет HTA элемента и, следовательно, не имеет прямого доступа к командной строке. Я обнаружил, что командную строку можно получить, запустив Windows & rsquo; wmic программа , но это ужасный взлом. Вся эта проблемная область, где большинство открытых дорог оказались закрытыми, является следствием того, что Microsoft теперь рассматривает устаревшие технологии HTA a и постепенно отказывается от них в пользу полноэкранного приложения для Windows 8 AppStore .

В любом случае, удачи!

0 голосов
/ 11 марта 2010

Идите и попробуйте Google Gears, который обеспечивает перетаскивание.

Вы даже можете использовать mysql в hta.

Google Gears недоступен в hta, однако вы можете создать активный объект в html-файле, а затем включить его с помощью iframe(<iframe application="true" src=".."></iframe>)

После этого вы можете использовать от activexobject до iframe.

0 голосов
/ 14 апреля 2009

Очевидно, что HTA не может быть целью операции удаления оболочки - ndash; по крайней мере, в моей системе сбросить что-либо на HTA невозможно.

Это означает, что вы не можете напрямую делать то, что вы намерены.

Однако .vbs может быть целью выпадения. Полные пути удаленных файлов доступны через коллекцию WScript.Arguments.Unnamed.

HTA имеет доступ к аргументам командной строки через Свойство commandLine . Это может означать, что вы могли бы создать небольшой вспомогательный VBScript, который переводит удаленные файлы в командную строку и вызывает для вас HTA.

Обратите внимание, что вы не можете удалить бесконечное количество файлов на .vbs, и командные строки также не безграничны. Там будет ограничение по длине в несколько кБ (я не пытался выяснить, где именно находится предел, просто будьте готовы встретить ограничение).

...