0

项目名称:文件标记

我个人使用“文件夹标记”来组织我的文件夹。它让我可以选择从上下文菜单(右键菜单)更改文件夹图标。我可以从上下文菜单中选择计划的工作、半完成的工作、已完成的工作,并且我的文件夹图标会相应更改。

现在我想为单个文件实现相同的概念。

我想在 windows 环境中使用 Java 来实现这个解决方案。

第 1 步:要在上下文菜单中添加内容,最简单的方法是启动注册表项。
所以我需要在这里做的是——

添加上下文菜单项:文件标记添加上下文子菜单项:计划的工作,半完成的工作,完成的工作(文件标记的子菜单)

第2步:

添加自定义属性

if(WorkStatus is "planned work") { 为值为 "planned work" 的文件设置一个特定图标我想我需要在这里使用 iconHandler }

我需要你关于如何实施它的建议。

这是该解决方案的正确方法吗?还是有更好的解决方案?

我也很高兴有 step1 和 step2 的示例代码

谢谢@布莱恩

4

1 回答 1

1

好吧,我有一些好消息和一些坏消息......

关于您的第 2 步(为特定文件设置图标):

由于您在谈论“注册表项”,因此我假设您在 Windows 下。在那种情况下,恐怕你无法更改特定文件的图标,除非它是快捷方式或 .EXE 或 .DDL 文件(其中可以包含资源,例如图标)。您可以更改的是文件类型的默认图标,这意味着所有相同类型的文件都会受到影响(这显然不符合您的要求)。

关于您的第 1 步(修改上下文菜单):

为了在Windows 7 或更高版本中实现您描述的结构(“文件制作器”子菜单,具有各种状态的多个条目(“计划的工作”、“半完成的工作”等)) ,您需要创建一个静态此处描述的级联菜单。(在 WindowsXP 和更早的版本中,您需要实现一个 ContextMenuHandler,这是一项复杂得多的任务——我不打算在本文中介绍)。

示例代码
您可以从命令提示符(具有管理权限)运行以下命令,或者将命令复制并粘贴到 .BAT 文件中,然后以管理员身份运行。这些命令的作用是:首先为每个文件注册一个子菜单(参见注册表项中的“*”)和可用的子菜单条目,然后为每个子菜单条目设置显示文本和命令。

注意:建议您在进行任何修改之前始终备份注册表。注册表是一个微妙的结构,所以请小心处理,风险自负:)

REG ADD "HKEY_CLASSES_ROOT\*\shell\File Marker" ^
/v "MUIVerb" /t REG_SZ /d "File Marker" /f

REG ADD "HKEY_CLASSES_ROOT\*\shell\File Marker" ^
/v "SubCommands" /t REG_EXPAND_SZ /d "WinIconChanger.PLANNED_WORK;WinIconChanger.HALF-DONE_WORK;WinIconChanger.DONE_WORK" /f

REG ADD "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\WinIconChanger.PLANNED_WORK" ^
/v "MUIVerb" /t REG_SZ /d "Planned work" /f
REG ADD "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\WinIconChanger.PLANNED_WORK\command" ^
/ve /t REG_SZ /d "\"C:\path\to\jre\bin\javaw.exe\" -jar \"C:\path\to\WinIconChanger.jar\" \"PLANNED_WORK\" \"%%1\"" /f

REG ADD "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\WinIconChanger.HALF-DONE_WORK" ^
/v "MUIVerb" /t REG_SZ /d "Half-done work" /f
REG ADD "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\WinIconChanger.HALF-DONE_WORK\command" ^
/ve /t REG_SZ /d "\"C:\path\to\jre\bin\javaw.exe\" -jar \"C:\path\to\WinIconChanger.jar\" \"HALF-DONE_WORK\" \"%%1\"" /f

REG ADD "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\WinIconChanger.DONE_WORK" ^
/v "MUIVerb" /t REG_SZ /d "Done work" /f
REG ADD "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\WinIconChanger.DONE_WORK\command" ^
/ve /t REG_SZ /d "\"C:\path\to\jre\bin\javaw.exe\" -jar \"C:\path\to\WinIconChanger.jar\" \"DONE_WORK\" \"%%1\"" /f

PAUSE

不要忘记将“C:\path\to\WinIconChanger.jar”和“C:\path\to\jre\bin\javaw.exe”替换为系统中的实际路径。

为了撤消对注册表所做的修改,您可以使用管理权限执行这些命令(或将它们保存在 .BAT 文件中并运行它):

REG DELETE "HKEY_CLASSES_ROOT\*\shell\File Marker" /f

REG DELETE "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\WinIconChanger.PLANNED_WORK" /f
REG DELETE "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\WinIconChanger.HALF-DONE_WORK" /f
REG DELETE "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\WinIconChanger.DONE_WORK" /f

PAUSE


当然,您将需要一个 .JAR 文件,该文件将采用两个参数,即工作状态(例如 PLANNED_WORK、DONE_WORK 等)和右键单击文件的路径,并对它们进行一些有用的操作(如果您只能更改文件的图标 :D)。
这是一个示例类

class WinIconChanger {
    static public void main(String[] args) {
        String filePath = "UNKNOWN";
        String state = "UNKNOWN";
        if (args.length == 2) {
            filePath = args[1];

            switch (args[0]) {
            case "PLANNED_WORK":
            case "HALF-DONE_WORK":
            case "DONE_WORK":
                state = args[0];
                break;
            default:
                break;
            }
        }

        if ("UNKNOWN".equals(state)) {
            javax.swing.JOptionPane.showMessageDialog(
                    null, 
                    "Unknown file or state !", 
                    "WinIconChanger Error", 
                    javax.swing.JOptionPane.ERROR_MESSAGE);
        } else {
            /* 
             * Change the icon of the file specified in args[1]
             * according to the state specified in args[0]
             */
            String msg = String.format(
                    "Let's assume I just changed the icon of '%s' to %s !",
                    filePath, state);
            javax.swing.JOptionPane.showMessageDialog(
                    null, 
                    msg,
                    "WinIconChanger Info",
                    javax.swing.JOptionPane.INFORMATION_MESSAGE);
        }
    }
}

(这只是一个粗略的示例,而不是生产就绪代码。您需要验证第二个参数确实对应于现有文件的路径,微调错误消息,捕获异常等)

于 2013-05-06T08:28:01.637 回答