質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

Windows10フォルダのアイコン変更時の即時反映方法について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 3,002

score 79

Windows10フォルダのアイコン変更時の即時反映方法について
Windows10で指定したフォルダのアイコンを変更するアプリケーションを考えています

Desktop.ini ファイルを生成し、システム属性にセット
.ShellClassInfo セクションに
IconFile,IconIndex を指定することで一応指定したフォルダのアイコンの差し替えはできました。
ただ、アイコンを差し替えた後でしばらくしないと変更したアイコンが反映されなかったり
サインインしないと反映されなかったりと動作が今一つ安定しません。

なので調べてアイコンキャッシュが残っているためすぐに反映されないらしいというところまでは
分かりいくつかの方法を試してみたのですがどれも今一つ確実性にかけるというかで
フォルダに指定したアイコンを即時、確実に変更する方法を探しています。
ご存知の方教えていただけないでしょうか?

開発には以下の環境を使用しています。
(Windows 10 pro / 64bit / VB.net 2010)
動作は Windows10 でのみ動けばいいです。

いくつかのサイトで見つけたやり方を試しています
これまでに試したのは

1.アイコンキャッシュのクリアコマンドとして
ie4uinit.exe -show コマンドをたたく(効果がわからず)

2.アイコンキャッシュファイルを削除してみようとする
(システムが使用中の為削除できず)

3.実行中のウインドウから"Progman"をさがしウインドウクラス名"SHELLDLL_DefView"を探して
そのウインドウにアイコンの非表示/表示を2回SendMessageする
(デスクトップのアイコンが消えて表示されただけだった)
Dim toggleDesktopCommand = New IntPtr(29698)
SendMessageA(hWndChild1, WM_COMMAND, toggleDesktopCommand, IntPtr.Zero)

4.SHChangeNotifyコマンドをたたく
(効果がいまいちわからず…?)
SHChangeNotify(&H8000000, &H1000, Nothing, Nothing)

5.SendMessage(HWND_BROADCAST をたたく
(効果がいまいちわからず…?)
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0)

6.起動中のエクスプローラをすべて終了させる
今のところ一番確実に更新できる
その代わり、デスクトップウインドウと起動中のエクスプローラがすべて再起動する…

一応「6.」をやればできることはできるのですが
可能であれば「現在起動中のエクスプローラ」を残したまま
アイコンの更新のみを行いたいです。

お力を貸していただけると幸いです。
よろしくお願いします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yukiyuki123456

    2019/10/16 13:03

    いえ、参考になりました。
    ありがとうございます

    キャンセル

  • yukiyuki123456

    2019/10/16 17:16

    自己解決しました。
    フォルダのアイコンを書き換える件
    こちらで即時反映できるようになりました。

    あらかじめ以下を書き込んだ後
    Desktop.ini
    [.ShellClassInfo]
    IconFile=●●●.ico
    IconIndex=0

    WindowsAPIのSHGetSetFolderCustomSettingsを
    FCS_READ | FCS_FORCEWRITEで呼び出したら
    画面のアイコンが更新されるようになしました。
    VBコード
    VBから呼び出す際に
    構造体のPACKや固定長の文字列を使用するのがポイントのようです。
    Dim mode As UInt32 =(FCS_READ Or FCS_FORCEWRITE)
    SHGetSetFolderCustomSettings(FolderSettings, pszPath, mode)

    ありがとうございました。

    キャンセル

  • dodox86

    2019/10/16 17:22 編集

    解決してよかったです。貴重な情報だと思いますので、回答の方へ自己解決として記載をお願いします。

    キャンセル

回答 3

checkベストアンサー

0

解決へ導く回答ではありません:

Windows10に限りませんが、要旨としては同じ質問回答がStackoverflowにありましたので、ご案内しておきます。

stackoverflow- How can I immediately reload a folder icon when desktop.ini is changed

いくつかの解法が試行された跡がありますが、こちらでの結論めいた回答は、「desktop.iniはユーザーが直接触るべきではない。」です。

You shouldn't try to edit a Desktop.ini directly. It doesn't get to make any change at an appearance of any folder.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/17 08:55 編集

    回答ありがとうございます

    キャンセル

0

自己解決できました。
いろいろ試して、こちらで動作するのを確認しました。
閲覧してくださった方々、回答いただけた dodox86様ありがとうございました。
これで質問を終了することにいたします。

Imports System, System.Runtime.InteropServices

''' <summary>
''' フォルダのアイコン表示を変更するクラス
''' </summary>
''' <remarks>
''' Windows 10 pro 64bitで動作を確認
''' </remarks>
Public Class ClassSetFolderIcon

'【使い方】
'Dim clsIcon As New ClassSetFolderIcon
'Dim targetFolder As String = "c:\wk"
'Dim iconFilePath As String = "100.ico" ' c:\wk\100.ico があるものとします
'Dim InfoTip As String = "フォルダアイコン変更のサンプルクラス"
'clsIcon.SetIcon(targetFolder, iconFilePath, InfoTip)

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)>
Public Structure LPSHFOLDERCUSTOMSETTINGS
Public dwSize As UInt32
Public dwMask As UInt32
Public pvid As IntPtr
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public pszWebViewTemplate As String
Public cchWebViewTemplate As UInt32
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public pszWebViewTemplateVersion As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public pszInfoTip As String
Public cchInfoTip As UInt32
Public pclsid As IntPtr
Public dwFlags As UInt32
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public pszIconFile As String
Public cchIconFile As UInt32
Public iIconIndex As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public pszLogo As String
Public cchLogo As UInt32
End Structure

Private Declare Function SHGetSetFolderCustomSettings Lib "Shell32.dll" (ByRef pfcs As LPSHFOLDERCUSTOMSETTINGS, ByVal pszPath As String, ByVal dwReadWrite As UInt32) As UInt32
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer
Private Declare Function PathMakeSystemFolder Lib "shlwapi.dll" Alias "PathMakeSystemFolderA" (ByVal pszPath As String) As Long

''' <summary>
''' 指定されたフォルダのアイコンを変更します
''' </summary>
''' <param name="targetFolder">アイコンを変更したいフォルダパス(例. c:wk)</param>
''' <param name="iconFilePath">アイコンパス絶対パス(c:\wk\100.ico) or targetFolderからの相対パス(100.ico)</param>
''' <param name="InfoTip">フォルダのTips表示文字列</param>
''' <remarks></remarks>
Public Sub SetIcon(ByVal targetFolder As String, ByVal iconFilePath As String, ByVal InfoTip As String)

Dim ss As String = InfoTip
Dim ca As String = ".ShellClassInfo"
Dim pszPath As String = targetFolder & "\Desktop.ini"

WritePrivateProfileString(ca, "InfoTip", ss, targetFolder & "\Desktop.ini")
WritePrivateProfileString(ca, "IconFile", iconFilePath, targetFolder & "\Desktop.ini")
WritePrivateProfileString(ca, "IconIndex", "0", targetFolder & "\Desktop.ini")
WritePrivateProfileString(ca, "IconResource", iconFilePath & ",0", targetFolder & "\Desktop.ini")

Dim finfo As System.IO.FileInfo = New System.IO.FileInfo(pszPath)
finfo.Attributes = (System.IO.FileAttributes.System Or System.IO.FileAttributes.Hidden)
PathMakeSystemFolder(targetFolder)

Dim FCS_WRITE As UInt32 = 3 ' FCS_READ=1 | FCS_FORCEWRITE=2
Dim FolderSettings As New LPSHFOLDERCUSTOMSETTINGS
FolderSettings.dwMask = &H10
Dim HRESULT As UInt32 = SHGetSetFolderCustomSettings(FolderSettings, pszPath, FCS_WRITE)
End Sub
End Class

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

別解

ie4uinit.exe -show  を、管理者権限で実行する。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/17 16:23

    回答あとがとうございます
    しかしながら
    Windows10 pro 64bit版で効果がないことを確認しています。

    キャンセル

  • 2019/10/21 18:21

    Windows 10 Pro 64bit版で、管理者として実行しないと効果がないことを確認しています。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る