好吧,我有一些好消息和一些坏消息......
关于您的第 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);
}
}
}
(这只是一个粗略的示例,而不是生产就绪代码。您需要验证第二个参数确实对应于现有文件的路径,微调错误消息,捕获异常等)