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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

2614閲覧

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

yukiyuki123456

総合スコア130

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/10/16 02:14

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/10/16 02:50

> 4.SHChangeNotifyコマンドをたたく > SHChangeNotify(&H8000000, &H1000, Nothing, Nothing) ですが、&H8000000はC言語ベースの生のWindows APIですと、SHCNE_ASSOCCHANGEDで「ファイル関連付けの変更」です。 https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shchangenotify この値を、&H7FFFFFFF にすると何か変化ありませんか? この値はSHCNE_ALLEVENTSで「全てのイベント発生」を意味します。 #define SHCNE_ALLEVENTS 0x7FFFFFFFL
yukiyuki123456

2019/10/16 02:59

回答ありがとうございます。 早速試してみて、最初の1回目は即時反映されたのですが その後、反映されないようです。 変更処理後少し時間を空けて(数十秒くらい)再度実行すると 反映されることもあるのですが今一つ動作が安定してない感じがします
dodox86

2019/10/16 03:01

最初の1回目は反映される、ということは前の&H8000000 のときとは違うということでしょうか?
dodox86

2019/10/16 03:03 編集

フォルダーアイコンを変更後、デスクトップ画面を表示している状態で、手動でF5キー(リフレッシュ)連打するとどうなりますか?
yukiyuki123456

2019/10/16 03:48

ありがとうございます こちらにして少し試してみました。 こちらでも更新されるときとされないときがあります。 SHChangeNotify(&H8000000, &H1000, Nothing, Nothing) Desktop.iniに設定 SHChangeNotify(&H8000000, &H1000, Nothing, Nothing)をたたく 更新されるときもあればされないときもある F5キーを押しても効果なし そのフォルダの名前を変更するとセットしたアイコンで表示される 名前を変更したフォルダをもとの名前にリネームすると 変更前のアイコンに戻るという感じです。 フォルダのパスとアイコンが関連ついているような感じがします
dodox86

2019/10/16 04:00 編集

ダメでしたか。残念です。&H8000000はプログラム内からデスクトップ上のショートカットを削除して、再度作成して更新するようなケースで有効だったので、このフラグの値如何で状況が変わるかと思ったのですが、ご質問のケースではあたらなそうです。お手数おかけしました。
yukiyuki123456

2019/10/16 04:03

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

2019/10/16 08: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 08:23 編集

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

回答3

0

別解

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

投稿2019/10/17 03:08

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukiyuki123456

2019/10/17 07:23

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

2019/10/21 09:21

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

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

投稿2019/10/16 23:57

yukiyuki123456

総合スコア130

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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/16 04:13

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukiyuki123456

2019/10/16 23:57 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問