回答編集履歴

6

設定の反映方法について追記

2022/10/24 06:49

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -21,8 +21,9 @@
21
21
  desktop.ini ファイルをエディタで直接編集や、プログラムで直接編集した場合は即時反映されないようです。
22
22
  (訂正: ~~恐らくキャッシュなどの影響~~ 変更した設定は再読み込みまで反映されない)
23
23
 
24
+
24
- 注意点、desktop.ini は特殊なファイルなので
25
+ 追記: 設定の反映方法についてSHChangeNotify により通知できるようです。folderikonよりctypesを用いた呼び出し例
25
- 書き込みの際には、権限やファイルの属性に注意。
26
+ https://github.com/demberto/FolderIkon/blob/master/folderikon/notify_shell.py
26
27
 
27
28
  ----
28
29
  尚、できれば Python でとのことですが、ファイルを直接編集するコードの場合は

5

参考コードの追加

2022/10/24 04:27

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -28,9 +28,12 @@
28
28
  尚、できれば Python でとのことですが、ファイルを直接編集するコードの場合は
29
29
  desktop.ini は 標準ライブラリの configparser モジュールにより扱うことができます。
30
30
  より簡潔で解りやすいコードにできるはずです。
31
- 参考: [windows folder icon changer](https://github.com/JIHONGO/windows-folder-icon-changer/blob/master/windows-folder-icon-changer.py)
31
+
32
32
  ※ サムネイルではなくアイコンですが、desktop.ini を configparser で操作するコードの参考に。
33
+ - [windows folder icon changer](https://github.com/JIHONGO/windows-folder-icon-changer/blob/master/windows-folder-icon-changer.py)
34
+ - 外部ライブラリで [folderikon](https://pypi.org/project/folderikon/)
33
35
 
36
+ ----
34
37
  ctypes でwin32 API を使う方法(質問に掲載のコードの方法) は、
35
38
  同様のコードを書く場合は C言語で書いたほうが短くかけます。
36
39
  (ctypes で扱う場合は、構造体館の宣言が必要ですが、C言語では必要なヘッダを読み込むのみ)
@@ -40,3 +43,5 @@
40
43
  C 言語の学習コストがあるかもしれませんが、C言語で行う必要があるのは API 呼び出し部分のみなので
41
44
  Python でフォルダーの一覧のループ処理をして、path 情報のみを C言語で作ったプログラムへ subprocess.call 等で渡す
42
45
  といった使い方であれば、学習コストを必要最低限に抑えることができます。
46
+
47
+

4

即時反映は、キャッシュではなく設定変更の通知が必要だったためなので訂正。

2022/10/24 04:21

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -10,7 +10,8 @@
10
10
  - PathMakeSystemFolder (`attrib +s FolderName` コマンド) で
11
11
  対象フォルダをシステムフォルダに変更 (desktop.ini によるカスタマイズを有効にする)
12
12
  - desktop.ini を配置
13
- - エクスプローラー(explorer.exe) を再起動。キャッシュが影響しないように再読込。
13
+ - エクスプローラー(explorer.exe) を再起動。~~キャッシュが影響しないように~~ 設定変更を反映させるため再読込。
14
+  追記: SHChangeNotify により設定変更を通知
14
15
 
15
16
  フォルダプロパティのカスタマイズから変更した場合
16
17
  フォルダー内の desktop.ini の `[ViewState]` セクション内の `Logo` に記録されます。
@@ -18,7 +19,7 @@
18
19
 
19
20
  カスタマイズから変更した場合や、上記のスクリプト(win32 API)で変更した場合は即時反映されますが
20
21
  desktop.ini ファイルをエディタで直接編集や、プログラムで直接編集した場合は即時反映されないようです。
21
- (恐らくキャッシュなどの影響)
22
+ 訂正: ~~恐らくキャッシュなどの影響~~ 変更した設定は再読み込みまで反映されない
22
23
 
23
24
  注意点、desktop.ini は特殊なファイルなので、
24
25
  書き込みの際には、権限やファイルの属性に注意。

3

実行結果のキャプチャを追加

2022/10/24 04:11

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -1,5 +1,8 @@
1
1
  私の環境では win10/python3.10 で、WindowsError が出ますが、設定自体は正常に変更できました。
2
2
  (追記: SHGetSetFolderCustomSettings 迄で変更可能だったので、関数内の後半は不要です)
3
+
4
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-24/04ce8ec3-9775-44b7-ba6b-f7091fbacd09.gif)
5
+
3
6
  隠しファイルを表示する設定にして、対象フォルダ内のdesktop.ini ファイルの中身を確認してみてください。
4
7
 
5
8
  [Desktop.iniを使用してフォルダーをカスタマイズする方法](https://learn.microsoft.com/ja-jp/windows/win32/shell/how-to-customize-folders-with-desktop-ini)

2

追記: エラーが出る部分は、目的の用途にとっては不要なコードでした。

2022/10/24 04:02

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -1,4 +1,5 @@
1
1
  私の環境では win10/python3.10 で、WindowsError が出ますが、設定自体は正常に変更できました。
2
+ (追記: SHGetSetFolderCustomSettings 迄で変更可能だったので、関数内の後半は不要です)
2
3
  隠しファイルを表示する設定にして、対象フォルダ内のdesktop.ini ファイルの中身を確認してみてください。
3
4
 
4
5
  [Desktop.iniを使用してフォルダーをカスタマイズする方法](https://learn.microsoft.com/ja-jp/windows/win32/shell/how-to-customize-folders-with-desktop-ini)

1

説明補足を追記

2022/10/24 03:52

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -23,7 +23,15 @@
23
23
  尚、できれば Python でとのことですが、ファイルを直接編集するコードの場合は
24
24
  desktop.ini は 標準ライブラリの configparser モジュールにより扱うことができます。
25
25
  より簡潔で解りやすいコードにできるはずです。
26
+ 参考: [windows folder icon changer](https://github.com/JIHONGO/windows-folder-icon-changer/blob/master/windows-folder-icon-changer.py)
27
+ ※ サムネイルではなくアイコンですが、desktop.ini を configparser で操作するコードの参考に。
26
28
 
27
29
  ctypes でwin32 API を使う方法(質問に掲載のコードの方法) は、
28
30
  同様のコードを書く場合は C言語で書いたほうが短くかけます。
29
31
  (ctypes で扱う場合は、構造体館の宣言が必要ですが、C言語では必要なヘッダを読み込むのみ)
32
+
33
+ C言語と言うと、巨大な開発環境のインストールが必要そうに思われるかもしれませんが、
34
+ これくらいの規模のユーティリティーであれば、tcc (Tiny C Compiler) がお勧めです。
35
+ C 言語の学習コストがあるかもしれませんが、C言語で行う必要があるのは API 呼び出し部分のみなので
36
+ Python でフォルダーの一覧のループ処理をして、path 情報のみを C言語で作ったプログラムへ subprocess.call 等で渡す
37
+ といった使い方であれば、学習コストを必要最低限に抑えることができます。