我正在構建一個用於個人使用的小型HTA,並希望能夠將文件拖放到界面。一旦文件被刪除,我會自動運行它(假設它適合我設置的一些參數,比如文件擴展名),或者至少填寫HTA接口上的輸入框。Javascript - 獲取文件路徑放入HTA
我已經廣泛搜索,但找不到解決方案。思考?
我正在構建一個用於個人使用的小型HTA,並希望能夠將文件拖放到界面。一旦文件被刪除,我會自動運行它(假設它適合我設置的一些參數,比如文件擴展名),或者至少填寫HTA接口上的輸入框。Javascript - 獲取文件路徑放入HTA
我已經廣泛搜索,但找不到解決方案。思考?
至少在我的系統上,HTA顯然不能成爲shell放置操作的目標,因此在HTA上放置某些東西是不可能的。
這意味着你不能直接做你想要的。
然而,.vbs可以是放置目標。已刪除文件的完整路徑可通過WScript.Arguments.Unnamed
集合獲得。
HTA通過the commandLine Property訪問它的命令行參數。這意味着您可以構建一個小型助手VBScript,將刪除的文件轉換爲命令行併爲您調用HTA。
請注意,您不能將無窮無盡的文件放在.vbs上,並且命令行也不是無限的。在幾kB的區域會有一個長度限制(我沒有試圖找到極限的確切位置,只准備面對一個限制。)
Tomalak,在他的聲明中是不正確的......那裏是做你想做的,除了你必須添加DropHandler在註冊表中的HTA文件,它很容易做,一旦完成,你將能夠做到你想做的。我找不到很多關於它的文檔,但是這裏有一個很長時間以前由一個叫Michel Gallant的人寫的HTA的鏈接,它告訴你如何去做:http://www.jensign.com/JavaScience/www/wsh/imager/index.html
當HTA啓動時,看看你是否已經配置了DropHandler。如果你不這樣做,它可以讓你選擇爲你配置它。一旦配置完所有你需要做的就是關閉並重新打開HTA和wallah,那麼你可以在HTA文件中進行拖放支持。
如果你不想啓用拖放處理程序,我可以想象一種方式,這可能是可能的。這有點像喜劇連鎖店,但是如果我被置於一個角落並且需要這種功能,我可以看到自己實現了這一點。
您可以創建一個將其src作爲臨時文件夾的IFRAME。該文件夾將顯示爲資源管理器視圖。然後您可以將文件拖入該文件中。針對該文件夾設置一個輪詢例程,以查看是否有新文件。瞧,你有一個蹩腳的方式來支持給定文件的拖放操作。
去嘗試谷歌齒輪提供拖放。
你甚至可以在hta中使用mysql。
谷歌Gears是不是在HTA提供,但是,你可以創建一個HTML文件中的ActiveXObject,然後包括它使用iframe(<iframe application="true" src=".."></iframe>)
之後,你可以使用activexobject
通過iframe
。
關於&hellip;
「 希望能夠拖放文件到[HTA]接口 」
&hellip;我將其理解爲希望將文件放到HTA ’運行窗口,而不是將文件放在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
(有許多的tutorials可用的,其鏈接更進一步的技術文件)。
在需要本地路徑,例如對於在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
元的成本,因此沒有直接訪問命令行。我發現the command line can be retrieved by running Windows’ wmic
program,但那’是一個可怕的黑客。這整個問題領域,顯然是開放的道路都被關閉,似乎是微軟現在考慮HTA a legacy technology, to be quietly phased out in favor of fullscreen ad-ridden Windows 8 AppStore apps的結果。
無論如何,祝你好運!
感謝您的回答!我以前很怕那個。我想我可能會使用Prism接口而不是HTA來訪問HTML頁面。 – Joshua 2009-04-14 16:51:09
-1「一個HTA顯然不能成爲shell放置操作的目標」(現在)不正確。啓用刪除到HTA文件或快捷方式,涉及一個簡單的註冊表更改,這就是它一直。支持在HTA窗口上放置HTML5現在很簡單。 – 2014-03-31 21:45:56