我正在构建一些HTA供个人使用,并希望能够将文件拖放到界面。文件删除后,我要么自动运行它(假设它适合我设置的某些参数,例如文件扩展名),或者至少填写了HTA接口上的输入框。

我已经广泛搜索,但找不到解决方案。想法?

有帮助吗?

解决方案

HTA显然不能成为外壳下降操作的目标 - 至少在我的系统上,将某些东西放在HTA上是不可能的。

这意味着你不能 直接地 做你打算的事情。

但是,.vbs可以是下降目标。丢弃文件的完整路径可通过 WScript.Arguments.Unnamed 收藏。

HTA可以通过访问其命令行参数 命令行属性. 。这意味着您可以构建一个小型助手VBScript,将删除的文件转换为命令行并为您调用HTA。

请注意,您不能在.vbs上删除无数文件,并且命令行也不是无限的。几个KB的区域将有一个长度限制(我没有试图找到限制到底位置,只需准备面对限制即可。)

其他提示

托马拉克(Tomalak)在他的陈述中是不正确的...有办法做您想做的事,除了您必须在hta文件注册表中添加drophandler,这真的很容易做到,一旦完成,您将能够准确地尝试您的尝试去做。我找不到太多的文档,但是这是一个很久以前由一个名叫Michel Gallant的家伙写的HTA的链接,向您展示了如何: http://www.jensign.com/javascience/www/wsh/imager/index.html

启动HTA时,看起来您是否已经配置了Drophandler。如果您不这样做,它为您提供了为您配置它的选项。一旦配置您要做的就是关闭并重新打开HTA和Wallah,就可以在HTA文件中拖放支持。

如果您不想启用Drop Hander,我可以想象一种可能的方法。这是一条喜剧链,但是如果我被倒入角落并需要该功能,我可以看到自己正在实施它。

您可以创建一个将其SRC作为临时文件夹的iframe。该文件夹将显示为探索器视图。然后,您可以将文件拖入其中。对该文件夹设置投票例程,以查看是否有任何新文件。瞧,您有一种用给定文件支持拖放操作的la脚方法。

去尝试提供拖放的Google齿轮。

您甚至可以在HTA中使用MySQL。

Google Gears在HTA中不可用,但是,您可以在HTML文件中创建ActiveXobject,然后使用一个 iframe(<iframe application="true" src=".."></iframe>)

之后,您可以使用 activexobject 通过 iframe.

关于 …

希望能够将文件拖放到[HTA]接口

…我将其解释为希望将文件删除到HTA的运行窗口,而不是将文件放在HTA文件本身或捷径上。

使用HTML5,掉落本身很容易。使用,例如a <div> 元素作为下降区域。对于此元素处理事件 dragenter, dragoverdrop. 。例如,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;
}

… 在哪里 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 );

到目前为止,一切都很好。

但是,安全措施限制: 您没有直接了解原始文件路径, ,仅文件名和文件大小。因为此功能是为Web设计的,而不是针对本地受信任的HTML应用程序设计的。因此,这可能是或不一定是一个问题。

  • 为了将删除的文件用作 资源 对于HTML元素,通常用于读取删除文件,HTML5提供了 FileReader (有很多 教程 可用,与技术文档进一步链接)。

  • 在需要本地路径的地方,例如在Windows Mediaplayer中播放文件,您可以 认为 该拖动操作源于Windows Explorer,现在也称为文件资源管理器,然后只需检查Explorer窗口(如果有)包含具有该名称和大小的文件。

希望能找到不超过一个这样的原始窗口。

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的命令行检索该命令行 wmic 程序, ,但这是一个糟糕的黑客。整个问题领域,最明显的开放道路已被封闭,这似乎是微软现在考虑到HTAS的结果 一个 旧技术, ,悄悄淘汰以支持全屏addridder Windows 8 AppStore应用程序.

无论如何,祝你好运!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top