项目名称:文件标记
我个人使用“文件夹标记”来组织我的文件夹。它为我提供了从上下文菜单(右键菜单)更改文件夹图标的选项。我可以从上下文菜单中选择计划工时、半完成工时、已完成工时以及我的文件夹图标的变化。
现在,我想对单个文件实现相同的概念。
我想在windows环境下使用Java来实现这个解决方案。
步骤1:要在上下文菜单中添加内容,最简单的方法是启动一个注册表项。
所以我需要做的是--
添加上下文菜单项:文件标记添加上下文SubMenu项:计划工时、半完成工时、完成工时(文件标记的子菜单)
第2步:
添加自定义属性
if(WorkStatus为“计划工时”){为值为“计划工时”的文件设置一个特定的图标,我觉得这里需要使用iconHandler }
我需要你关于如何实施它的建议。
这是这个解决方案的正确方法吗?或者有更好的解决方案?
我也很高兴能有step1和step2的示例代码
谢谢@Brian
发布于 2013-05-06 16:28:02
好吧,我有一些好消息和一些坏消息...
关于您的Step 2 (设置特定文件的图标):
既然你说的是“注册表项”,我假设你是在Windows下。在这种情况下,恐怕您无法更改特定文件的图标,除非它是快捷方式或.EXE或.DDL文件(可以包含资源,如图标)。您可以更改的是文件类型的默认图标,这意味着相同类型的所有文件都会受到影响(这显然不符合您的要求)。
关于您的Step 1 (修改上下文菜单):
为了在Windows7或更高版本的中实现您所描述的结构(“文件生成器”子菜单,对于各种状态(“计划工作”、“完成了一半的工作”等)具有多个条目),您需要创建一个如here所述的静态级联菜单。(在WindowsXP和更早的版本中,您需要实现一个ContextMenuHandler,这是一项复杂得多的任务-我不打算在本文中讨论这一点)。
示例代码
您可以从命令提示符(具有管理权限)运行以下命令,或者将命令复制并粘贴到.BAT文件中,然后以管理员身份运行该文件。这些命令的作用是:首先为每个文件注册一个子菜单(参见注册表项中的"*“)和可用的子菜单项,然后为每个子菜单项设置display-text和command。
注意:建议您在进行任何修改之前始终备份注册表。注册表是一个微妙的结构,所以请特别小心,风险自负:)
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);
}
}
}(这只是一个粗略的示例,并不是生产就绪的代码。您需要验证第二个参数是否确实对应于现有文件的路径,调整错误消息,捕获异常等。)
https://stackoverflow.com/questions/14737244
复制相似问题