2009-04-14 121 views
1

我正在構建一個用於個人使用的小型HTA,並希望能夠將文件拖放到界面。一旦文件被刪除,我會自動運行它(假設它適合我設置的一些參數,比如文件擴展名),或者至少填寫HTA接口上的輸入框。Javascript - 獲取文件路徑放入HTA

我已經廣泛搜索,但找不到解決方案。思考?

回答

-2

至少在我的系統上,HTA顯然不能成爲shell放置操作的目標,因此在HTA上放置某些東西是不可能的。

這意味着你不能直接做你想要的。

然而,.vbs可以是放置目標。已刪除文件的完整路徑可通過WScript.Arguments.Unnamed集合獲得。

HTA通過the commandLine Property訪問它的命令行參數。這意味着您可以構建一個小型助手VBScript,將刪除的文件轉換爲命令行併爲您調用HTA。

請注意,您不能將無窮無盡的文件放在.vbs上,並且命令行也不是無限的。在幾kB的區域會有一個長度限制(我沒有試圖找到極限的確切位置,只准備面對一個限制。)

+0

感謝您的回答!我以前很怕那個。我想我可能會使用Prism接口而不是HTA來訪問HTML頁面。 – Joshua 2009-04-14 16:51:09

+1

-1「一個HTA顯然不能成爲shell放置操作的目標」(現在)不正確。啓用刪除到HTA文件或快捷方式,涉及一個簡單的註冊表更改,這就是它一直。支持在HTA窗口上放置HTML5現在很簡單。 – 2014-03-31 21:45:56

5

Tomalak,在他的聲明中是不正確的......那裏是做你想做的,除了你必須添加DropHandler在註冊表中的HTA文件,它很容易做,一旦完成,你將能夠做到你想做的。我找不到很多關於它的文檔,但是這裏有一個很長時間以前由一個叫Michel Gallant的人寫的HTA的鏈接,它告訴你如何去做:http://www.jensign.com/JavaScience/www/wsh/imager/index.html

當HTA啓動時,看看你是否已經配置了DropHandler。如果你不這樣做,它可以讓你選擇爲你配置它。一旦配置完所有你需要做的就是關閉並重新打開HTA和wallah,那麼你可以在HTA文件中進行拖放支持。

1

如果你不想啓用拖放處理程序,我可以想象一種方式,這可能是可能的。這有點像喜劇連鎖店,但是如果我被置於一個角落並且需要這種功能,我可以看到自己實現了這一點。

您可以創建一個將其src作爲臨時文件夾的IFRAME。該文件夾將顯示爲資源管理器視圖。然後您可以將文件拖入該文件中。針對該文件夾設置一個輪詢例程,以查看是否有新文件。瞧,你有一個蹩腳的方式來支持給定文件的拖放操作。

0

去嘗試谷歌齒輪提供拖放。

你甚至可以在hta中使用mysql。

谷歌Gears是不是在HTA提供,但是,你可以創建一個HTML文件中的ActiveXObject,然後包括它使用iframe(<iframe application="true" src=".."></iframe>)

之後,你可以使用activexobject通過iframe

0

關於&hellip;

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

&hellip;我將其理解爲希望將文件放到HTA ’運行窗口,而不是將文件放在HTA文件本身或其快捷方式上。

使用HTML5,本身很簡單。使用例如一個<div>元素作爲放置區域。對於此元素處理事件dragenter,dragoverdrop。例如。下拉處理程序可以看起來像這樣:

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的結果。

無論如何,祝你好運!