以下是HTA文件的代码:
<html>
<head>
<title>HTA application</title>
<script type="text/javascript">
function f(x){alert("You opened the file " + x)}
</script>
</head>
<body>
Here's some text in an HTA application...
</body>
</html>
有没有办法在Windows上将文件扩展名与此HTA应用程序相关联,这样当您打开具有此扩展名的文件时,它会打开HTA应用程序并执行f(path)
其中path
所在的功能打开文件的路径?
修改
这可能有助于找到解决方案:
<script type="text/javascript">
window.onload = function(){
var arr = location.href.split("?");
if(arr.length == 2){
f(arr[1]);
}
}
</script>
所以当我打开文件时,我希望它打开一个带有HTA文件名后跟“?”的URL。然后是打开文件的名称。在URL之后放置“?something”不会更改打开的文件,但location.href
属性会检测到它。问题是,我如何在注册表中执行此操作?像C:\Users\Donald\example.hta + "?" + %1
中的HKEY_CLASSES_ROOT\examplefile\shell\open\command
可能是什么?
我仍然接受原始问题的其他解决方案,这只是如何找到答案的建议。
答案 0 :(得分:1)
不,任何扩展都不能这样做。你需要以某种方式调用你的函数。在声明函数后使用直接调用,如下所示:
f(window.location.href);
...或用IIFE(立即调用的函数表达式)替换声明:
(function f(x){alert("You opened the file " + x)}(window.location.href));
window.location.href
包含协议和文件的完整路径。如果您只需要路径,请使用window.location.pathname
。
答案 1 :(得分:0)
这个答案不仅仅是HTA,因为它涉及使用C / C ++创建可执行文件。我设法通过创建一个带有C / C ++的可执行文件(在这种情况下它与两种语言中的代码完全相同)打开一个带有HTA的文件,我将其放在与包含此代码的HTA相同的文件夹中: / p>
#include <windows.h>
#include <string.h>
int main(int argc,char *argv[]){
if(argc == 1){
char *toOpen = malloc(strlen(argv[0]) + 47);
strcpy(toOpen,"\"C:\\Windows\\System32\\mshta.exe\" \"");
strcat(toOpen,argv[0]);
*strrchr(toOpen,'\\') = '\0';
strcat(toOpen,"\\example.hta\"");
WinExec(toOpen,SW_SHOWMAXIMIZED);
free(toOpen);
}
else{
char *toOpen = malloc(strlen(argv[0]) + strlen(argv[1]) + 48);
strcpy(toOpen,"\"C:\\Windows\\System32\\mshta.exe\" \"");
strcat(toOpen,argv[0]);
*strrchr(toOpen,'\\') = '\0';
strcat(toOpen,"\\example.hta?");
strcat(toOpen,argv[1]);
strcat(toOpen,"\"");
WinExec(toOpen,SW_SHOWMAXIMIZED);
free(toOpen);
}
return 0;
}
对于那些不懂C或C ++的人来说,它是用于制作exectuables(.exe文件)的语言,并且与HTML或HTA无关,所以不要试图插入上面的代码在HTA文件中。如果您不了解C或C ++,我建议您阅读其中一种语言(或两者)的教程,例如this one for C或this one for C++(或者在Google上搜索教程)。
然后我在HTA中插入了以下代码:
<script type="text/javascript">
window.onload = function(){
var arr = location.href.split("?");
if(arr.length == 2){
f(arr[1]); //f() is the function called when opening a file
}
}
</script>
并将此代码放入注册表项HKEY_CLASSES_ROOT\examplefile\shell\open\command
(用可执行文件打开文件的标准代码):
"C:\Users\Donald\example.exe" "%1"