好的,我成功了……基础知识是在注册表中使用 DropHandler UUID。我做了一个基础设置,如下:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.class]
@="JavaClass"
[HKEY_CLASSES_ROOT\JavaClass\DefaultIcon]
@="C:\\Java\\jdk1.6.0_05\\bin\\java.exe,1"
[HKEY_CLASSES_ROOT\JavaClass\shell\open]
@="Run Java class"
[HKEY_CLASSES_ROOT\JavaClass\shell\open\command]
@="\"C:\\Java\\jdk1.6.0_05\\bin\\java.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\JavaClass\shellex\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"
而且...它没有用!
我只是忘记了 java.exe 想要一个类名,而不是文件名!但我认为在注册表中没有办法做到这一点。
幸运的是,有一个解决方法,如果我们想要通用,仍然需要一个脚本文件来处理任何/所有类文件(当然,使用静态 main 函数!)。不是批次,我尽可能避免它们。我选择使用 WSH,因为它应该可以在任何现代 Windows 系统上使用。我也选择了做一个JS脚本,它也可以是一个VB脚本。
所以我制作了以下脚本(LaunchJavaClass.js):
if (WScript.Arguments.count() == 0)
{
WScript.StdOut.Write("No parameters");
WScript.Quit(1);
}
var className = WScript.Arguments.Item(0);
//~ WScript.StdOut.Write(className + "\n");
var m = className.match(/^(.*)\\(.+?)\.class$/);
if (m == null)
{
WScript.StdOut.Write("Not a class file");
WScript.Quit(1);
}
var classPath = m[1];
className = m[2];
//~ WScript.StdOut.Write(classPath + " >>> " + className + "\n");
var params = new Array();
for (i = 1; i < WScript.Arguments.count(); i++)
{
params[params.length] = WScript.Arguments.Item(i);
}
var cmd = "cmd /c cd /D " + classPath +
" & C:/Java/jdk1.6.0_05/bin/java.exe " +
className + " " + params.join(" ");
//~ WScript.StdOut.Write(cmd + "\n");
var shell = WScript.CreateObject("WScript.Shell");
//~ var exec = shell.Exec(cmd); // Can be used to get stdout
shell.Run(cmd, 0);
我留下了一些输出,在这种情况下没有用,但可用于调试(使用 cscript 运行)。
当然,JRE的路径是必须要调整的。
我在注册表中更改了command,如下:
[HKEY_CLASSES_ROOT\JavaClass\shell\open\command]
@="\wscript -b "D:\\_PhiLhoSoft\\WSH\\LaunchJavaClass.js\" %1 %*"
当然,调整路径,保持上面的其他行。
现在,如果我将一些文件拖放到 .class 文件中,它会获取短文件路径作为 main() 函数的参数。
import java.io.*;
class TestDnD
{
public static void main(String[] args)
{
Writer output = null;
try
{
output = new BufferedWriter(new FileWriter(new File("LogFile.txt")));
for (String arg : args)
{
output.write(arg + "\n");
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
return;
}
finally
{
try { output.close(); } catch (IOException e) {}
}
}
}
我认为 .reg 文件的第一个版本可以用于其他用途,例如。在 .jar 文件上拖放(当然要适应它)。
这种技术的用途有限:我们很少用 Java 编写一类程序!但这看起来是一个很好且有趣的挑战,所以我没有抗拒去解决它。注意:如果您需要使用外部库(在 jar 文件中),可以添加 -Djava.ext.dirs="some path;another path" 之类的内容。