【问题标题】:Change File Icon in windows using Java使用Java更改Windows中的文件图标
【发布时间】:2013-02-06 19:32:30
【问题描述】:

项目名称:文件标记

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

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

我想用Java在windows环境下实现这个方案。

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

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

第 2 步:

添加自定义属性

if(WorkStatus 是“计划工作”) { 为值为“计划工作”的文件设置特定图标 我想我需要在这里使用 iconHandler }

我需要您对如何实施它的建议。

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

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

谢谢 @布莱恩

【问题讨论】:

  • @Brian 请跟进
  • 幸好我看到了这个。我的意思是编辑你的original question。如果我们认为它有足够的细节,我们可以重新打开您的原始问题。此外,在 cmets 中使用 @ 仅在我已经对其发表评论的情况下才有效。重新问这个问题通常是不受欢迎的。您可以使用问题下方的edit 链接进行修改。

标签: java windows attributes icons contextmenu


【解决方案1】:

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

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

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

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

为了在 Windows 7 或更高版本,您需要按照here 的描述创建一个静态级联菜单。 (在 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);
        }
    }
}

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

【讨论】:

  • @AhmmadIsmail:您现在不接受答案有什么特别的原因吗?
  • @AhmmadIsmail:非常好的推理!也许我们应该警告 StackOverflow 管理员,为对这个 1.5 年前的问题进行大规模访问做准备,以便对其进行投票。并警告 StackOverflow 用户永远不要再接受答案! (掌心)
  • @AhmmadIsmail:是我把手掌放在脸上(因为我无法相信我正在阅读的内容:D)。没什么大不了的,真的......
  • @AhmmadIsmail:天哪!这确实有效!这么多答案涌入:)
猜你喜欢
  • 2013-10-21
  • 1970-01-01
  • 2012-03-08
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2012-07-09
相关资源
最近更新 更多