5

アイコンを手動で(つまり、エクスプローラーの[フォルダーオプション]ウィンドウからではなく)置き換えている場合、アイコンが更新されません。たとえば、このバッチコードを実行すると、次のようになります。

REG ADD HKCR\testfile\DefaultIcon /ve /d "C:\test.ico,0" /f

アイコンは[フォルダオプション]のリストに表示されているとおりに表示されますが、デスクトップまたはエクスプローラでは更新されません。

任意のファイルタイプの[アイコンの変更]ボタンを押して[フォルダオプション]ウィンドウを終了すると、アイコンが更新されます。しかし、私が知る限り、これはバッチまたはVBSを介して行うことはできません。

explorer.exeを再起動しても機能しますが、そうすると、タスクバーのアプリケーションタブが何らかの理由でバグになります(たとえば、アプリケーションが最大化されている場合、タスクバーのタブを左クリックして最小化することはできません)もう-私は実際にそれを右クリックして最小化を押す必要があります...)。言うまでもなく、そのようにすると、開いているすべてのエクスプローラウィンドウが閉じてしまい、少し面倒です。

アイコンキャッシュをリロードするオプションがあるTuneUpUtilitiesのコピーもありますが、これは意図したとおりに機能します。しかし、繰り返しになりますが、バッチまたはVBSを介してこのツールにアクセスすることはできません。また、explorer.exeを再起動したり、ファイルを削除したりすることはありません(一部のソリューションのように)。OSドライブのどこにもiconcache.dbファイルがないので、私はこれに前向きです。

代わりにVBSを介してレジストリエントリを追加しようとしましたが、それは役に立ちませんでした。

バッチまたはVBScriptソリューションは大歓迎です!

4

3 に答える 3

3

ファイルを関連付けることにより、システムはアイコンを更新するので、私の簡単な解決策は次のとおりです。

ASSOC .anyextension=anytype
ASSOC .anyextension=

2行目は、拡張機能の関連付けを解除します。

于 2012-11-08T05:44:29.387 に答える
1

このページには、キャッシュを再構築するVBプログラムがあります(実際のコードについては、frmRebuiltIconCache.frmを参照してください)。

の値を調べ、HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Sizeそこから1を減算し、を介してタイムアウトを強制しSendMessageTimeout、値をリセットして、タイムアウトを繰り返します。

(外部プログラムなしで)vbsからDLLを呼び出すことができないという事実のために、これはあなたが必要とするものをあなたに与えないかもしれません。私はこれにプログラムを減らしました:

'SendMessageTimeout values
Const HWND_BROADCAST = &HFFFF
Const WM_SETTINGCHANGE = &H1A
Const SPI_SETNONCLIENTMETRICS = &H2A
Const SMTO_ABORTIFHUNG = &H2

'Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" _
'  (ByVal hwnd As Long, ByVal msg As Long, _
'  ByVal wParam As Long, ByVal lParam As Long, _
'  ByVal fuFlags As Long, ByVal uTimeout As Long, _
'  lpdwResult As Long) As Long

Dim icon_size
Dim new_icon_size
Dim result
Dim SysVarReg
Set SysVarReg = WScript.CreateObject("WScript.Shell")
    ' Get the current icon size.
icon_size = SysVarReg.RegRead ("HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size")
    ' Increase the value by 1.
new_icon_size = CInt(icon_size) + 1
SysVarReg.RegWrite "HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size", new_icon_size
    ' Send HWND_BROADCAST to refresh the icons.
SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 10000, result
    ' Restore the original value.
SysVarReg.RegWrite "HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size", icon_size
    ' Send HWND_BROADCAST to refresh the icons again.
SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 10000, result

ただし、DLL呼び出しをラップするものがないと、vbsを介してこれを行うことはできません。

于 2012-11-07T20:49:42.833 に答える
0
' It work in XP.

' The following is "VBA" Module.

' ---------------------------------------------------------

'SendMessageTimeout values
Const HWND_BROADCAST = &HFFFF
Const WM_SETTINGCHANGE = &H1A
Const SPI_SETNONCLIENTMETRICS = &H2A
Const SMTO_ABORTIFHUNG = &H2

Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" _
  (ByVal hwnd As Long, ByVal msg As Long, _
  ByVal wParam As Long, ByVal lParam As Long, _
  ByVal fuFlags As Long, ByVal uTimeout As Long, _
  lpdwResult As Long) As Long


Sub Rebuild_Icon_cache()

Dim icon_size
Dim new_icon_size
Dim result
Dim SysVarReg

Set SysVarReg = CreateObject("WScript.Shell")

' Get the current icon size.
icon_size = SysVarReg.RegRead("HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size")

' Increase the value by 1.
new_icon_size = CInt(icon_size) + 1
SysVarReg.RegWrite "HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size", new_icon_size

' Send HWND_BROADCAST to refresh the icons.
SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 10000, result

' Restore the original value.
SysVarReg.RegWrite "HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size", icon_size

' Send HWND_BROADCAST to refresh the icons again.
SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 10000, result

End Sub
于 2014-03-20T07:08:17.360 に答える