Изменить значок файла в окнах с помощью Java

Название проекта: маркер файла

Я лично организую свои папки, используя "Marker Marker". Это дает мне возможность изменить значок папки из контекстного меню (контекстное меню). Я могу выбрать запланированную работу, выполнить половину работы, выполнить работу из контекстного меню и изменить значок папки.

Теперь я хочу реализовать ту же концепцию для отдельных файлов.

Я хочу использовать Java для реализации этого решения в среде Windows.

Шаг 1: Чтобы добавить что-то в контекстное меню, самый простой способ - инициировать запись в реестре. Так что мне нужно сделать здесь -

Добавить элемент контекстного меню: маркер файла Добавить элемент контекста SubMenu: запланированная работа, работа с половиной работы, выполненная работа (подменю File Marker)

Шаг 2:

Добавить пользовательский атрибут

if (WorkStatus - "запланированная работа" ) { установите конкретный значок для файла, значение которого - "запланированная работа", Я думаю, мне нужно использовать iconHandler Here }

Мне нужно ваше предложение о том, как его реализовать.

Это правильный подход для этого решения. Или есть лучшее решение?

Я также был бы рад иметь пример кода для step1 и step2

Спасибо @Брайан

1 ответ

Хорошо, у меня есть хорошие новости и плохие новости...

Что касается вашего Шаг 2 (значок настройки для определенного файла):

Поскольку вы говорите о "Записях реестра", я предполагаю, что вы находитесь под Windows. В этом случае я боюсь, что вы не можете изменить значок определенного файла, если это не ярлык или файл .EXE или .DDL(который может содержать ресурсы, такие как значки). Что вы можете изменить, это значок по умолчанию для типа файла, что означает, что все файлы одного типа будут затронуты (и это явно не соответствует вашему требованию).

Что касается вашего Шаг 1 (изменение контекстного меню):

Чтобы создать описанную вами структуру (подменю "File Maker" с несколькими записями для разных состояний ( "Планируемая работа", "Работа с половиной работы" и т.д.)) в Windows 7 или новее, вам необходимо создать статическое каскадное меню, как описано здесь. (В WindowsXP и ранее вам нужно реализовать ContextMenuHandler, который является значительно более сложной задачей, которую я не собираюсь покрывать в этом asnwer).

Пример кода: Вы можете запускать следующие команды из командной строки (с административными привилегиями) или копировать и вставлять команды в .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 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);
 }
 }
}

(Это просто отрывочный пример, а не готовый к производству код. Вам нужно убедиться, что второй аргумент действительно соответствует пути к существующему файлу, точно настраивает сообщения об ошибках, catch Exceptions и т.д.)

licensed under cc by-sa 3.0 with attribution.