gpt4 book ai didi

java - 如何为我的软件制作上下文菜单?

转载 作者:行者123 更新时间:2023-12-03 00:10:05 26 4
gpt4 key购买 nike

因此,我们的想法是制作一种仅在.txt文件上工作的加密软件,并在其上应用一些加密功能并生成一个新文件。为了避免用户不得不拖放文件的麻烦,我决定在此处选择与我的防病毒类似的选项。

我想学习如何针对各种OS制作这些文件,无论其体系结构是什么:)

  • 这些菜单叫什么? 我的意思是专有名称,所以下次我可以用更清晰的方式指代它们
  • 如何制作这些?

  • 我的初步理解:

    我认为它将做的是:将文件作为参数传递给 main()方法,然后将其余的处理留给我:)

    最佳答案

    可能不完全是您想要的答案,但这似乎是一件相当复杂的事情。无论如何,我将分享我对它的了解,并且希望它将证明足以(至少)使您入门。

    不幸的是,使用Java创建上下文菜单的最简单方法是编辑注册表。我将尝试总结总体要求的里程碑以及实现我们目标的步骤。

    <更新>
    请参阅文章末尾的示例代码链接和有效的演示。


    需要做什么

  • 我们需要编辑注册表,在我们感兴趣的文件类型(例如.txt.doc.docx)的上下文菜单中添加一个附加条目(对于我们的java-app)。
  • 我们需要确定注册表中要编辑的条目,因为我们的目标文件扩展名可能与另一个“类”相关联(我无法在XP上进行测试,但在Windows 7/8上似乎是这种情况)。例如。而不是编辑...\Classes\.txt,我们可能需要编辑...\Classes\txtfile类关联的.txt
  • 我们需要指定安装的jre的路径(除非我们可以确定包含javaw.exe的目录在PATH变量中)。
  • 我们需要在适当的注册表节点下插入适当的键,值和数据。
  • 我们需要一个打包为.JAR文件的Java应用程序,并使用main方法期望一个String数组,该数组包含一个值,该值对应于我们需要处理的文件的路径(嗯,这很容易-只是显而易见) 。

  • 这一切说起来容易做起来难(或者反过来呢?),所以让我们看看完成每个任务要花些什么。

    首先,对于本文的其余部分,我们会做一些假设(为了简单/清晰/简洁等)。

    假设条件
  • 我们假设目标文件类别是.TXT文件-可以对每个文件类别应用相同的步骤。
  • 如果我们希望更改(即上下文菜单)影响所有用户,则需要在HKCR\(例如HKCR\txtfile)下编辑注册表项,这需要管理权限。
    为简单起见,我们假设仅需要更改当前用户的设置,因此我们将不得不在HKCU\Software\Classes(例如HKCU\Software\Classes\txtfile)下编辑 key ,这不需要而不是需要管理权限。
    如果选择进行系统范围的更改,则必须进行以下修改:
  • 在所有REG ADD/DELETE命令中,将HKCU\Software\Classes\...替换为HKCR\...(在REG QUERY命令中将替换为,而不是)。
  • 使您的应用程序具有管理权限。这里有两个选项(我知道):
  • 提升运行实例的权限(由于UAC,使用最新的Windows版本可能会更加复杂)。网上有很多资源,所以这里有很多资源。 this one 似乎很有前途(但我自己尚未对其进行测试)。
  • 要求用户以“以管理员身份”显式运行您的应用程序(使用右键单击->“以管理员身份运行”等)。
  • 我们假设只需要简单的上下文菜单项(与具有更多条目的上下文子菜单相对)。
    经过一些(相当浅薄的)研究,我开始相信在较旧版本的Windows(XP,Vista)中添加子菜单将需要更复杂的内容(ContextMenuHandlers等)。在Windows 7或更高版本中添加子菜单要容易得多。我在 this answer (提供的工作演示)的相关部分中描述了该过程。

  • 也就是说,让我们继续...

    把事情做好
  • 您可以通过发出REG Operation [Parameter List]形式的命令来实现编辑注册表,并执行涉及ADDDELETEQUERY的操作(稍后会详细介绍)。
    为了执行必要的命令,我们可以使用 ProcessBuilder 实例。例如。
    String[] cmd = {"REG", "QUERY", "HKCR\\.txt", "/ve"};new ProcessBuilder(cmd).start();// Executes: REG QUERY HKCR\.txt /ve
    当然,我们可能希望捕获并进一步处理命令的返回值,这可以通过相应的Process的 getInputStream() 方法来完成。但这属于“实现细节”的范围...
  • “通常”,我们必须编辑.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的路径)不在此答案的范围内,但是应该有很多方法可以做到(尽管我不知道我会100%信任)。
    我只列出几个问题:
  • 寻找环境变量'JAVA_HOME'(System.getenv("java.home");)。
  • 在注册表中查找类似于HKLM\Software\JavaSoft\Java Runtime Environment\<CurrentVersion>\JavaHome的值。
  • 在预定义的位置(例如C:\Program Files[ (x86)]\Java\)中查找。
  • 提示用户在JFileChooser中指出它(对没有经验的用户来说不是很好)。
  • 使用Launch4J之类的程序将.JAR包装到.EXE中(这样就无需自己确定指向'javaw.exe'的路径了)。

  • Java的最新版本(1.7+吗?)在路径上放置了 javaw.exe(和其他实用程序)的副本,因此也值得检查一下。

    3.因此,在收集了所有必要的数据之后,出现了主要部分:将所需的值插入注册表中。完成此步骤后,我们的 HKCU\Software\Classes\txtfile -node应该如下所示:
    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)是否已经有一个名为“MyCoolContextMenu”的上下文菜单条目,或者我们可能会覆盖一个现有条目(这不会使我们的用户感到高兴),这可能是一个好主意。 。
  • 由于需要将值的数据部分(位于/d之后和/f之前的部分)括在""中,因此请记住,可以将字符串内的"转义为\"
    您还需要对%1进行转义,以便将其按原样存储在注册表值中(将其转义为:%%1)。
  • 建议您为用户提供“取消注册”上下文菜单项的选项。
    可以通过以下命令取消注册:REG DELETE HKCU\Software\Classes\txtfile\Shell\MyCoolContextMenu /f
  • 在命令末尾省略/f可能会提示“用户”(在这种情况下为您的应用)进行确认,在这种情况下,您需要使用Process的 getOutputStream() 方法来输出"is"以进行操作要完成的。
    我们可以使用force标志(/f)避免不必要的交互。

  • 差不多了 !

    在步骤(2)中找到自己,我们现在应该具有以下内容:
  • txtfile类别中为我们的文件注册的上下文菜单项(请注意,它不限于.TXT文件,而是适用于与系统有关的所有文件“txtfiles”)。
  • 单击该条目后,应运行我们的java-app,其main()方法将传递一个String数组,其中包含右键单击.TXT文件的路径。

  • 从那里,我们的应用程序可以接管并发挥其魔力:)

    差不多了,伙计们!

    抱歉,很长的帖子。我希望它对某人有用。
    我将尝试尽快添加一些演示代码(尽管没有 promise ;)。

    更新

    演示已准备就绪!
  • 我创建了一个很小的 demo-project
  • 这是 source code
  • 这是现成的 JARred App
  • 关于java - 如何为我的软件制作上下文菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16771006/

    26 4 0