Question SendMessage: Refresh Windows Explorer

Crazy

Member
Joined
Oct 3, 2008
Messages
5
Programming Experience
1-3
I need to refresh windows explorer from within a form.

I've been searching on the internet without much luck.

So far I think I found that I need to broadcast a WM_WININICHANGE(&H1A).
This is the code I have so far, when I run RefreshExplorer it should refresh it:


VB.NET:
    Private Const WM_WININICHANGE = &H1A
    Private Const HWND_BROADCAST = &HFFFF
    Private Const SMTO_ABORTIFHUNG = &H2

    Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Object) As Long
    Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As String, ByVal fuFlags As Long, ByVal uTimeout As Long, ByVal lpdwResult As Long) As Long

    Private Sub RefreshExplorer()
        SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0)
        SendMessageTimeout(HWND_BROADCAST, WM_WININICHANGE, 0, "Environment", SMTO_ABORTIFHUNG, 5000, New Long())
    End Sub


I'd really appreciate any help, i'm getting desperate
 
Last edited:
Actually there a little trick I use to do this. If you have your program create a dummy file in the root drive and the delete it after. That should cause Windows explorer to refresh.

Btw the prototypes for these methods are wrong. They should be like so..

VB.NET:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As int32, ByVal wMsg As int32, ByVal wParam As int32, ByVal lParam As Object) As int32
    Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" (ByVal hwnd As int32, ByVal msg As int32, ByVal wParam As int32, ByVal lParam As String, ByVal fuFlags As int32, ByVal uTimeout As int32, ByVal lpdwResult As int32) As int32
 
The trick of creating a file and then deleting it doesn't seem to work. It's not refreshing.

The reason I need to refresh explorer is to reload the overlay icons(so basically an f5).

I changed the SendMessage and SendMessageTimeout, I found allot of variations of this on the internet. But it doesn't do the trick :(, still won't refresh.

Any idea's on what might be the cause?
 
Actually looking at it I don't think this is the correct approach. Try this...

VB.NET:
<DllImport("shell32.dll")> _
    Shared Sub SHChangeNotify( _
    ByVal wEventID As HChangeNotifyEventID, _
    ByVal uFlags As HChangeNotifyFlags, _
    ByVal dwItem1 As IntPtr, _
    ByVal dwItem2 As IntPtr)
    End Sub

 <Flags()> _
    Public Enum HChangeNotifyFlags
     SHCNF_DWORD = &H3
      SHCNF_IDLIST = &H0
       SHCNF_PATHA = &H1
        SHCNF_PATHW = &H5
        SHCNF_PRINTERA = &H2
    '    SHCNF_PRINTERW = &H6
        SHCNF_FLUSH = &H1000
      SHCNF_FLUSHNOWAIT = &H2000
    End Enum


 <Flags()> _
    Public Enum HChangeNotifyEventID
    SHCNE_ALLEVENTS = &H7FFFFFFF
    SHCNE_ASSOCCHANGED = &H8000000
    SHCNE_ATTRIBUTES = &H800
    SHCNE_CREATE = &H2
    SHCNE_DELETE = &H4
    SHCNE_DRIVEADD = &H10    SHCNE_DRIVEADDGUI = &H10000
    SHCNE_DRIVEREMOVED = &H80
    SHCNE_EXTENDED_EVENT = &H4000000
    SHCNE_FREESPACE = &H40000
    SHCNE_MEDIAINSERTED = &H20
    SHCNE_MEDIAREMOVED = &H40
    SHCNE_MKDIR = &H8
    SHCNE_NETSHARE = &H200
    SHCNE_NETUNSHARE = &H400
    SHCNE_RENAMEFOLDER = &H20000
    SHCNE_RENAMEITEM = &H1
    SHCNE_RMDIR = &H10
    SHCNE_SERVERDISCONNECT = &H4000
      SHCNE_UPDATEDIR = &H1000
    SHCNE_UPDATEIMAGE = &H8000
    End Enum
Then use like this...

VB.NET:
SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero)
 
It works!, thank you so much :)

I have been trying to get this to work for a couple of days now :). You saved me allot of time.
 
Back
Top