Java 如何为我的软件创建上下文菜单?

Java 如何为我的软件创建上下文菜单?,java,windows,contextmenu,Java,Windows,Contextmenu,因此,我们的想法是制作一个只对.txt文件起作用的加密软件,并在其上应用一些加密功能,生成一个新文件。为了避免用户拖放文件的麻烦,我决定在这里做一个类似于我的防病毒软件的选项 我想学习如何为各种操作系统制作这些,而不考虑体系结构:) 这些菜单叫什么?我指的是正确的名称,所以下次我可以更清楚地引用它们 如何制作这些? 我的初步理解是: 我认为它会做的是:将文件作为参数传递给main()方法,然后将其余的处理留给我:)可能不是您希望的答案,但这似乎是一个相当复杂的问题。无论如何,我会分享我对它的了解

因此,我们的想法是制作一个只对
.txt
文件起作用的加密软件,并在其上应用一些加密功能,生成一个新文件。为了避免用户拖放文件的麻烦,我决定在这里做一个类似于我的防病毒软件的选项

我想学习如何为各种操作系统制作这些,而不考虑体系结构:)

  • 这些菜单叫什么?我指的是正确的名称,所以下次我可以更清楚地引用它们
  • 如何制作这些?
  • 我的初步理解是:
    我认为它会做的是:将文件作为参数传递给
    main()
    方法,然后将其余的处理留给我:)

    可能不是您希望的答案,但这似乎是一个相当复杂的问题。无论如何,我会分享我对它的了解,希望它足以(至少)让你开始

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


    有关示例代码和工作演示的链接,请参见文章末尾。

    需要做什么
  • 我们需要编辑注册表,在感兴趣的文件类型(例如
    .txt
    .doc
    .doc
    .docx
    )的上下文菜单中添加一个附加条目(对于我们的java应用程序)

  • 我们需要确定要编辑注册表中的哪些条目,因为我们的目标文件扩展名可能与另一个“类”关联(我无法在XP上测试它,但在Windows 7/8上似乎就是这样)。例如,我们可能需要编辑与
    .txt
    类关联的
    ..\Classes\txtfile
    ,而不是编辑
    ..\Classes\.txt

  • 我们需要指定安装的jre的路径(除非我们可以确保包含
    javaw.exe
    的目录在path变量中)

  • 我们需要在适当的注册表节点下插入适当的键、值和数据

  • 我们需要一个打包为.JAR文件的java应用程序,其
    main
    方法需要一个字符串数组,该数组包含一个与我们需要处理的文件路径相对应的值(好吧,这是最简单的部分-仅说明显而易见的部分)

  • 所有这些都说起来容易做起来难(或者说是相反的吗?),所以让我们看看如何才能完成每一项

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

    假设
  • 我们假设目标文件类别是
    .TXT
    文件-可以对每个文件类别应用相同的步骤
  • 如果我们希望更改(即上下文菜单)影响所有用户,我们需要编辑
    HKCR\
    (例如
    HKCR\txtfile
    )下的注册表项,这需要管理权限。 为了简单起见,我们假设只需要更改当前用户的设置,因此我们必须编辑
    HKCU\Software\Classes
    (例如
    HKCU\Software\Classes\txtfile
    )下的键,不需要管理特权。 如果选择进行系统范围的更改,则需要进行以下修改:
  • 在所有
    REG ADD/DELETE
    命令中,将
    HKCU\Software\Classes\…
    替换为
    HKCR\…
    (不要在
    REG QUERY
    命令中替换它)
  • 以管理权限运行应用程序。这里有两个选项(我知道):
    • 提升运行实例的权限(由于UAC的原因,最新版本的windows可能会更复杂)。网上有很多资源,这里也有很多似乎很有希望(但我自己还没有测试过)
    • 要求用户明确地以“管理员身份”运行您的应用程序(使用右键单击->“以管理员身份运行”等)
  • 我们假设只需要简单的上下文菜单项(与包含更多项的上下文子菜单相反)。 经过一些(相当肤浅的)研究,我开始相信在旧版本的Windows(XP、Vista)中添加子菜单需要更复杂的东西(ContextMenuHandler等)。在Windows7或更高版本中添加子菜单要简单得多。我在的相关部分(提供了工作演示)中描述了该过程 也就是说,让我们继续

    做事
  • 您可以通过发出
    REG Operation[参数列表]
    形式的命令来实现对注册表的编辑,操作涉及
    ADD
    DELETE
    QUERY
    (稍后将详细介绍)。 为了执行必要的命令,我们可以使用实例。例如

    String[]cmd={“REG”,“QUERY”,“HKCR\\.txt”,““/ve”}
    newprocessbuilder(cmd.start()
    //执行:REG QUERY HKCR\.txt/ve

    当然,我们可能希望捕获并进一步处理命令的返回值,这可以通过相应的process'方法完成。但这属于“实施细节”的范围

  • “通常”我们必须编辑
    .txt
    文件类,除非它与另一个文件类关联。我们可以使用以下命令对此进行测试:

    //检查键“HKCR\.txt”的“默认”值

    REG查询HKCR\.txt/ve

    //可能的输出:

    (默认)REG_SZ 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.
  • 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)      |  -----------------
                                            ----------------