0

プロジェクト名: ファイル マーカー

私は個人的に「フォルダ マーカー」を使用してフォルダを整理しています。コンテキスト メニュー (右クリック メニュー) からフォルダー アイコンを変更するオプションが表示されます。コンテキストメニューから計画中の作業、途中の作業、完了した作業を選択すると、それに応じてフォルダのアイコンが変化します。

ここで、個々のファイルに同じ概念を実装したいと考えています。

Javaを使用して、このソリューションをWindows環境に実装したいと考えています。

ステップ 1: コンテキスト メニューに何かを追加する最も簡単な方法は、レジストリ エントリを開始することです。
ここで私がしなければならないことは -

Add Context Menu item : File Marker Add Context SubMenu item : 予定された作業、途中の作業、完了した作業 (File Marker のサブメニュー)

ステップ2:

カスタム属性を追加

if(WorkStatus is "planned work") { 値が "planned work" であるファイルに特定のアイコンを設定する ここで iconHandler を使用する必要があると思います }

それを実装する方法についてあなたの提案が必要です。

このソリューションの正しいアプローチですか。または、より良い解決策はありますか?

step1とstep2のサンプルコードもあれば嬉しいです

ありがとう@ブライアン

4

1 に答える 1

1

さて、良いニュースと悪いニュースがあります...

ステップ 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


もちろん、作業の状態 (PLANNED_WORK、DONE_WORK など) と右クリックされたファイルへのパスの 2 つの引数を取り、それらに対して何か役立つことを行う .JAR ファイルが必要です (変更することしかできない場合)。ファイルのアイコン: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);
        }
    }
}

(これは大雑把な例であり、本番環境で使用できるコードではありません。2 番目の引数が実際に既存のファイルへのパスに対応していることを確認し、エラー メッセージを微調整し、例外をキャッチする必要があります。)

于 2013-05-06T08:28:01.637 に答える