Q&A
前提
Windowsのエクスプローラーで表示されるフォルダ内のサムネイルを、Pythonを使って変更したいのですが、方法が分からないため教えていただきたいです。
(Windowsのエクスプローラーで、特大アイコン表示をすると以下のようにフォルダ内の画像がサムネイルとして表示されますが、画像が複数枚ある時にはランダムで画像が選択されるため、Pythonを使ってこの画像を指定したいです。)
フォルダのプロパティからも手動で画像を指定できるのですが、指定したいフォルダの数が大量にあり、機械的に処理したいと思っています。
Python指定なのは私がPythonしか使えないためです。
ただ、他の言語等で解決策がある場合、そちらでもよいので教えていただけると幸いです。
調べたことなど
以下の、SHFOLDERCUSTOMSETTINGS構造体に含まれるpszLogoが、フォルダのサムネイル画像を指しているのだと思い、これを変更しようと試みました。
https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/ns-shlobj_core-shfoldercustomsettings
以下のコードを参考にして、pszLogoを書き換えるようなコードを書いて実行してみましたが、サムネイルは変化しませんでした。
https://stackoverflow.com/questions/4662759/how-to-change-folder-icons-with-python-on-windows
(上記コードはサムネイルではなくアイコン自体を書き換える処理です。一応、上記を実行するとアイコンの書き換えはできました)
実行したソースコード
python3
1import os 2import ctypes 3from ctypes import POINTER, Structure, c_wchar, c_int, sizeof, byref 4from ctypes.wintypes import BYTE, WORD, DWORD, LPWSTR, LPSTR 5import win32api 6 7HICON = c_int 8LPTSTR = LPWSTR 9TCHAR = c_wchar 10MAX_PATH = 260 11FCS_READ = 0x00000001 12FCSM_LOGO = 0x00000020 13FCSM_ICONFILE = 0x00000010 14FCS_FORCEWRITE = 0x00000002 15SHGFI_ICONLOCATION = 0x000001000 16 17class GUID(Structure): 18 _fields_ = [ 19 ('Data1', DWORD), 20 ('Data2', WORD), 21 ('Data3', WORD), 22 ('Data4', BYTE * 8)] 23 24class SHFOLDERCUSTOMSETTINGS(Structure): 25 _fields_ = [ 26 ('dwSize', DWORD), 27 ('dwMask', DWORD), 28 ('pvid', POINTER(GUID)), 29 ('pszWebViewTemplate', LPTSTR), 30 ('cchWebViewTemplate', DWORD), 31 ('pszWebViewTemplateVersion', LPTSTR), 32 ('pszInfoTip', LPTSTR), 33 ('cchInfoTip', DWORD), 34 ('pclsid', POINTER(GUID)), 35 ('dwFlags', DWORD), 36 ('pszIconFile', LPTSTR), 37 ('cchIconFile', DWORD), 38 ('iIconIndex', c_int), 39 ('pszLogo', LPTSTR), 40 ('cchLogo', DWORD)] 41 42class SHFILEINFO(Structure): 43 _fields_ = [ 44 ('hIcon', HICON), 45 ('iIcon', c_int), 46 ('dwAttributes', DWORD), 47 ('szDisplayName', TCHAR * MAX_PATH), 48 ('szTypeName', TCHAR * 80)] 49 50def setthumbnail(folderpath, thumbnailpath): 51 52 shell32 = ctypes.windll.shell32 53 54 folderpath = str(os.path.abspath(folderpath)) 55 thumbnailpath = str(os.path.abspath(thumbnailpath)) 56 57 fcs = SHFOLDERCUSTOMSETTINGS() 58 fcs.dwSize = sizeof(fcs) 59 fcs.dwMask = FCSM_LOGO 60 fcs.pszLogo = thumbnailpath 61 fcs.cchLogo = 0 62 63 hr = shell32.SHGetSetFolderCustomSettings(byref(fcs), folderpath, 64 FCS_FORCEWRITE) 65 66 if hr: 67 raise WindowsError(win32api.FormatMessage(hr)) 68 69 sfi = SHFILEINFO() 70 hr = shell32.SHGetFileInfoW(folderpath, 0, byref(sfi), sizeof(sfi), 71 SHGFI_ICONLOCATION) 72 if hr == 0: 73 raise WindowsError(win32api.FormatMessage(hr)) 74 75 index = shell32.Shell_GetCachedImageIndexW(sfi.szDisplayName, sfi.iIcon, 0) 76 if index == -1: 77 raise WindowsError() 78 79 shell32.SHUpdateImageW(sfi.szDisplayName, sfi.iIcon, 0, index) 80 81setthumbnail({対象フォルダのパス}, {.pngのパス})
setthumbnailで、icoファイルはbmpファイルを指定しても変化はありませんでした。
どなたかわかる方がいらっしゃいましたらご教示お願い致します。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/10/26 12:46