因此,我们的想法是制作一个仅适用于.txt
个文件的加密软件,并在其上应用一些加密函数并生成一个新文件。为了避免用户不得不拖放文件的麻烦,我决定在这里做一个类似于我的反病毒的选项。
我想学习如何为各种操作系统制作这些,无论架构如何:)
我认为它会做的是:将文件作为参数传递给main()
方法,然后将剩下的处理留给我:)
答案 0 :(得分:5)
可能不完全是你所希望的答案,但似乎这是一个相当复杂的问题。无论如何,我会分享我对它的了解,并且希望能够证明(至少)能让你开始。
不幸的是,使用Java创建上下文菜单的最简单方法是编辑注册表。我将尝试总结总体要求的里程碑和实现目标的步骤。
<强>&LT; UPDATE&GT; 强>
请参阅帖子末尾的示例代码链接和工作演示
的&LT; / UPDATE&GT; 强>
我们需要编辑注册表,在我们感兴趣的文件类型的上下文菜单中添加一个额外的条目(对于我们的java-app)(例如.txt
,.doc
, .docx
)。
我们需要确定要编辑的注册表中的哪些条目,因为我们的目标文件扩展名可能与另一个&#39;类&#39; (我无法在XP上测试它,但在Windows 7/8上似乎就是这种情况)。例如。我们可能需要修改与...\Classes\.txt
类相关联的...\Classes\txtfile
,而不是编辑.txt
。
我们需要指定已安装jre的路径(除非我们可以确定包含javaw.exe
的目录在PATH变量中)。
我们需要在正确的注册表节点下插入正确的密钥,值和数据。
我们需要一个打包为.JAR文件的java-app,其中main
方法期望一个String数组包含一个值,该值对应于我们需要处理的文件的路径(嗯,那& #39;是容易的部分 - 只是说明显而易见的事。)
所有这些说起来容易做起来难得(或者反之亦然?),所以让我们看看如何完成每一项工作。
首先,我们将在本文的其余部分做一些假设(为了简单/清晰/简洁等)。
.TXT
个文件 - 可以对每个文件类别应用相同的步骤。 HKCR\
下的注册表项(例如HKCR\txtfile
),这需要管理权限。
为简单起见,我们假设只需要更改当前用户的设置,因此我们必须编辑HKCU\Software\Classes
下的密钥(例如HKCU\Software\Classes\txtfile
),这样做 not 需要管理权限。
如果选择进行系统范围的更改,则需要进行以下修改:
REG ADD/DELETE
命令中,将HKCU\Software\Classes\...
替换为HKCR\...
(在REG QUERY
命令中执行不替换它)。那就是说,让我们继续......
您可以通过发布REG Operation [Parameter List]
表单的命令来实现对注册表的编辑,其中包含ADD
,DELETE
,QUERY
的操作(稍后会详细介绍) 。
为了执行必要的命令,我们可以使用 ProcessBuilder 实例。例如。
String[] cmd = {"REG", "QUERY", "HKCR\\.txt", "/ve"};
new ProcessBuilder(cmd).start();
// Executes: REG QUERY HKCR\.txt /ve
当然,我们可能希望捕获并进一步处理命令的返回值,这可以通过相应的过程来完成。 getInputStream()
方法。但这属于范围&#34; 实施细节&#34; ...
&#34;通常&#34;我们必须编辑.txt
文件类,,除非它与另一个文件类相关联。我们可以使用以下命令对此进行测试:
// This checks the "Default" value of key 'HKCR\.txt'
REG QUERY HKCR\.txt /ve
// Possible output:
(Default) REG_SZ txtfile
我们需要的是解析上面的输出并找出,如果默认值为空或包含类名。在此示例中,我们可以看到关联的类为txtfile
,因此我们需要编辑节点HKCU\Software\Classes\txtfile
。
指定jre路径(更确切地说是指向javaw.exe
的路径)超出了本答案的范围,但应该有很多方法可以做到(我不知道一个我会百分之百地信任。)
我只列出了一些我的头脑:
System.getenv("java.home");
)。HKLM\Software\JavaSoft\Java Runtime Environment\<CurrentVersion>\JavaHome
之类的值。 C:\Program Files[ (x86)]\Java\
)。 最新版本的Java(1.7 +?)在路径上放置了javaw.exe
(以及其他实用程序)的副本,因此也可能需要检查它。
3.因此,在收集了所有必要的数据之后,主要部分是:将所需的值插入到Registry中。完成此步骤后,我们的HKCU\Software\Classes\txtfile
- 节点应如下所示:
HKCU
|_____Software
|_____Classes
|_____txtfile
|_____Shell
|_____MyCoolContextMenu: [Default] -> [Display name for my menu-entry]
|_____Command: [Default] -> [<MY_COMMAND>]*
*: in this context, a '%1' denotes the file that was right-clicked.
根据您对步骤(1.2)的处理方式,命令可能如下所示:
"C:\Path\To\javaw.exe" -jar "C:\Path\To\YourApp.jar" "%1"
请注意,javaw.exe
通常位于...\jre\bin\
(但并非总是 - 最近我也在C:\Windows\System32\
中找到了它子>
仍然在步骤(1.3)中,为了实现上述结构,我们需要执行的命令如下所示:
REG ADD HKCU\Software\Classes\txtfile\Shell\MyCoolContextMenu /ve /t REG_SZ /d "Click for pure coolness" /f
REG ADD HKCU\Software\Classes\txtfile\Shell\MyCoolContextMenu\Command /ve /t REG_SZ /d "\"C:\Path\To\javaw.exe\" -jar \"C:\Path\To\Demo.jar\" \"%%1\" /f"
// Short explanation:
REG ADD <Path\To\Key> /ve /t REG_SZ /d "<MY_COMMAND>" /f
\_____/ \___________/ \_/ \_______/ \_______________/ \_/
__________|_______ | | |___ | |
|Edit the Registry | | _______|________ | _______|_______ |
|adding a key/value| | |Create a no-name| | |Set the data | |
-------------------- | |(default) value | | |for this value.| |
| ------------------ | |Here: a command| |
_______________|______________ | |to be executed.| |
|Edit this key | | ----------------- |
|(creates the key plus | ____|_________ _________|_____
| any missing parent key-nodes)| |of type REG_SZ| |No confirmation|
-------------------------------- |(string) | -----------------
----------------
实施注意事项 :
txtfile
)是否已经有一个名为&#34; MyCoolContextMenu&#34;的上下文菜单条目,或者我们可能覆盖现有的类似乎是一个好主意。条目(这不会让我们的用户非常高兴)。/d
之后和/f
之前的部分)需要包含在""
中,请记住您可以逃避{{1在字符串内部"
。
您还需要转义\"
,以便它按原样存储在注册表值中(将其转义为:%1
)。 %%1
REG DELETE HKCU\Software\Classes\txtfile\Shell\MyCoolContextMenu /f
可能会提示用户&#34; (在这种情况下是你的应用程序)进行确认,在这种情况下你需要使用Process&#39; getOutputStream()
输出方法&#34;是&#34;为了完成操作。
我们可以使用强制标记(/f
)来避免不必要的交互。在步骤(2)找到自己,我们现在应该有以下内容:
/f
中的文件注册的上下文菜单条目(请注意,它不仅限于.TXT文件,而是适用于系统所涉及的所有文件&#34; txtfiles&#34;) txtfile
方法传递一个String数组,其中包含右键单击的.TXT文件的路径。从那里,我们的应用程序可以接管并发挥其魔力:)
对不起,对于长篇文章。我希望结果对某人有用 我会尽快添加一些演示代码(尽管没有承诺;))。
更新
演示准备好了!