首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Java更改windows中的文件图标

使用Java更改windows中的文件图标
EN

Stack Overflow用户
提问于 2013-02-07 03:32:30
回答 1查看 2.7K关注 0票数 0

项目名称:文件标记

我个人使用“文件夹标记”来组织我的文件夹。它为我提供了从上下文菜单(右键菜单)更改文件夹图标的选项。我可以从上下文菜单中选择计划工时、半完成工时、已完成工时以及我的文件夹图标的变化。

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

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

步骤1:要在上下文菜单中添加内容,最简单的方法是启动一个注册表项。

所以我需要做的是--

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

第2步:

添加自定义属性

if(WorkStatus为“计划工时”){为值为“计划工时”的文件设置一个特定的图标,我觉得这里需要使用iconHandler }

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

这是这个解决方案的正确方法吗?或者有更好的解决方案?

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

谢谢@Brian

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-06 16:28:02

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

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

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

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

为了在Windows7或更高版本的中实现您所描述的结构(“文件生成器”子菜单,对于各种状态(“计划工作”、“完成了一半的工作”等)具有多个条目),您需要创建一个如here所述的静态级联菜单。(在WindowsXP和更早的版本中,您需要实现一个ContextMenuHandler,这是一项复杂得多的任务-我不打算在本文中讨论这一点)。

示例代码

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

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

代码语言:javascript
运行
复制
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文件中并运行):

代码语言:javascript
运行
复制
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)。

这里的是一个示例类

代码语言:javascript
运行
复制
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);
        }
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14737244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档