如何在注册表更改后刷新资源管理器

时间:2013-07-18 19:24:36

标签: .net vb.net windows-8 pinvoke explorer

我正在尝试在更改注册表中的值后刷新系统(Windows 8),此值会影响资源管理器设置,是否显示/隐藏复选框的值:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Shown
    RegEdit.Set_Value("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", _
                      "AutoCheckSelect", "1", Microsoft.Win32.RegistryValueKind.DWord)
End Sub

为了刷新系统,我使用了这个:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero)
End Sub

我尝试了很多旗帜组合。

问题是浏览器窗口刷新但复选框没有出现(或者没有被删除),我仍然需要在每个资源管理器窗口中按F5进行完整的更改刷新。

这是完整的代码:

Imports System.Runtime.InteropServices

Public Class Form1

<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
    ' <summary>
    ' The <i>dwItem1</i> and <i>dwItem2</i> parameters are DWORD values.
    ' </summary>
    SHCNF_DWORD = &H3
    ' <summary>
    ' <i>dwItem1</i> and <i>dwItem2</i> are the addresses of ITEMIDLIST structures that
    ' represent the item(s) affected by the change.
    ' Each ITEMIDLIST must be relative to the desktop folder.
    ' </summary>
    SHCNF_IDLIST = &H0
    ' <summary>
    ' <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings of
    ' maximum length MAX_PATH that contain the full path names
    ' of the items affected by the change.
    ' </summary>
    SHCNF_PATHA = &H1
    ' <summary>
    ' <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings of
    ' maximum length MAX_PATH that contain the full path names
    ' of the items affected by the change.
    ' </summary>
    SHCNF_PATHW = &H5
    ' <summary>
    ' <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings that
    ' represent the friendly names of the printer(s) affected by the change.
    ' </summary>
    SHCNF_PRINTERA = &H2
    ' <summary>
    ' <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings that
    ' represent the friendly names of the printer(s) affected by the change.
    ' </summary>
    SHCNF_PRINTERW = &H6
    ' <summary>
    ' The function should not return until the notification
    ' has been delivered to all affected components.
    ' As this flag modifies other data-type flags it cannot by used by itself.
    ' </summary>
    SHCNF_FLUSH = &H1000
    ' <summary>
    ' The function should begin delivering notifications to all affected components
    ' but should return as soon as the notification process has begun.
    ' As this flag modifies other data-type flags it cannot by used by itself.
    ' </summary>
    SHCNF_FLUSHNOWAIT = &H2000
End Enum


<Flags()> _
Public Enum HChangeNotifyEventID
    ' <summary>
    ' All events have occurred.
    ' </summary>
    SHCNE_ALLEVENTS = &H7FFFFFFF

    ' <summary>
    ' A file type association has changed. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/>
    ' must be specified in the <i>uFlags</i> parameter.
    ' <i>dwItem1</i> and <i>dwItem2</i> are not used and must be <see langword="null"/>.
    ' </summary>
    SHCNE_ASSOCCHANGED = &H8000000

    ' <summary>
    ' The attributes of an item or folder have changed.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the item or folder that has changed.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_ATTRIBUTES = &H800

    ' <summary>
    ' A nonfolder item has been created.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the item that was created.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_CREATE = &H2

    ' <summary>
    ' A nonfolder item has been deleted.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the item that was deleted.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_DELETE = &H4

    ' <summary>
    ' A drive has been added.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the root of the drive that was added.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_DRIVEADD = &H100

    ' <summary>
    ' A drive has been added and the Shell should create a new window for the drive.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the root of the drive that was added.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_DRIVEADDGUI = &H10000

    ' <summary>
    ' A drive has been removed. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the root of the drive that was removed.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_DRIVEREMOVED = &H80

    ' <summary>
    ' Not currently used.
    ' </summary>
    ' SHCNE_EXTENDED_EVENT = &H4000000

    ' <summary>
    ' The amount of free space on a drive has changed.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the root of the drive on which the free space changed.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_FREESPACE = &H40000

    ' <summary>
    ' Storage media has been inserted into a drive.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the root of the drive that contains the new media.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_MEDIAINSERTED = &H20

    ' <summary>
    ' Storage media has been removed from a drive.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the root of the drive from which the media was removed.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_MEDIAREMOVED = &H40

    ' <summary>
    ' A folder has been created. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/>
    ' or <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the folder that was created.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_MKDIR = &H8

    ' <summary>
    ' A folder on the local computer is being shared via the network.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the folder that is being shared.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_NETSHARE = &H200

    ' <summary>
    ' A folder on the local computer is no longer being shared via the network.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the folder that is no longer being shared.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_NETUNSHARE = &H400

    ' <summary>
    ' The name of a folder has changed.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the previous pointer to an item identifier list (PIDL) or name of the folder.
    ' <i>dwItem2</i> contains the new PIDL or name of the folder.
    ' </summary>
    SHCNE_RENAMEFOLDER = &H20000

    ' <summary>
    ' The name of a nonfolder item has changed.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the previous PIDL or name of the item.
    ' <i>dwItem2</i> contains the new PIDL or name of the item.
    ' </summary>
    SHCNE_RENAMEITEM = &H1

    ' <summary>
    ' A folder has been removed.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the folder that was removed.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_RMDIR = &H10

    ' <summary>
    ' The computer has disconnected from a server.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the server from which the computer was disconnected.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' </summary>
    SHCNE_SERVERDISCONNECT = &H4000

    ' <summary>
    ' The contents of an existing folder have changed
    ' but the folder still exists and has not been renamed.
    ' <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or
    ' <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>.
    ' <i>dwItem1</i> contains the folder that has changed.
    ' <i>dwItem2</i> is not used and should be <see langword="null"/>.
    ' If a folder has been created deleted or renamed use SHCNE_MKDIR SHCNE_RMDIR or
    ' SHCNE_RENAMEFOLDER respectively instead.
    ' </summary>
    SHCNE_UPDATEDIR = &H1000

    ' <summary>
    ' An image in the system image list has changed.
    ' <see cref="HChangeNotifyFlags.SHCNF_DWORD"/> must be specified in <i>uFlags</i>.
    ' </summary>
    SHCNE_UPDATEIMAGE = &H8000
End Enum


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Shown
    RegEdit.Set_Value("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", _
                      "AutoCheckSelect", "0", Microsoft.Win32.RegistryValueKind.DWord)
End Sub


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero)
End Sub

End Class

3 个答案:

答案 0 :(得分:2)

您可以尝试将SHChangeNotify()与SHCNE_ALLEVENTS事件一起使用,它可能会起作用。之后它可能会刷新资源管理器。否则你必须考虑其他一些技巧

答案 1 :(得分:1)

你可以尝试一些廉价的技巧。

- Send a "F5" keystroke to the explorer window so you don't have to do it manually.
- kill explorer.exe, and relaunch it.

看看这个。 How to refresh Windows Explorer

答案 2 :(得分:1)

我尝试做类似的事情 - 更新开始菜单的注册表设置,然后立即让开始菜单反映更改。

The solution from this MSDN question完美地为我工作。

  

您可以尝试广播WM_SETTINGCHANGE消息。例如:

class Program
{
    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr SendMessageTimeout(IntPtr hWnd, int Msg, IntPtr wParam, string lParam, uint fuFlags, uint uTimeout, IntPtr lpdwResult);

    private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff);
    private const int WM_SETTINGCHANGE = 0x1a;
    private const int SMTO_ABORTIFHUNG = 0x0002;

    static void Main(string[] args)
    {
        SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, null, SMTO_ABORTIFHUNG, 100, IntPtr.Zero);
    }
}