复制Windows取消隐藏文件夹和文件function

我正在重新访问一个我在VB.Net中为我的帮助台团队编写的工具,并希望添加一些checkbox来复制Windows用于显示隐藏文件和文件夹/重新隐藏的相同function,如以及受保护的操作系统文件。

我知道我可以通过编辑registry项并重新启动explorer.exe来做到这一点,但是closures所有打开的资源pipe理器窗口,我不想这样做。

有谁知道Windows是如何通过简单的点击一个checkbox,以及如何能够在VB.net中编码?

对此的任何input是事先非常赞赏。


编辑:所以它看起来像我find了刷新Windows资源pipe理器/文件资源pipe理器,可以应用到Drarig的答案下面的刷新方法,但我有麻烦转换为VB.net原来的例子是在C#中。

'Original at http://stackoverflow.com/questions/2488727/refresh-windows-explorer-in-win7 Private Sub refreshExplorer(ByVal explorerType As String) Dim CLSID_ShellApplication As Guid = Guid.Parse("13709620-C279-11CE-A49E-444553540000") Dim shellApplicationType As Type = Type.GetTypeFromCLSID(CLSID_ShellApplication, True) Dim shellApplication As Object = Activator.CreateInstance(shellApplicationType) Dim windows As Object = shellApplicationType.InvokeMember("Windows", Reflection.BindingFlags.InvokeMethod, Nothing, shellApplication, New Object() {}) Dim windowsType As Type = windows.GetType() Dim count As Object = windowsType.InvokeMember("Count", Reflection.BindingFlags.GetProperty, Nothing, windows, Nothing) For i As Integer = 0 To CType(count, Integer) Dim item As Object = windowsType.InvokeMember("Item", Reflection.BindingFlags.InvokeMethod, Nothing, windows, New Object() {i}) Dim itemType As Type = item.GetType() 'Only fresh Windows explorer Windows Dim itemName As String = CType(itemType.InvokeMember("Name", Reflection.BindingFlags.GetProperty, Nothing, item, Nothing), String) If itemName = explorerType Then itemType.InvokeMember("Refresh", Reflection.BindingFlags.InvokeMethod, Nothing, item, Nothing) End If Next End Sub 

当我将itemType设置为Type = item.GetType()时,我得到一个exception对象引用未设置为对象的实例 。 我不知道哪个对象没有被创build。 当我遍历代码时,它看起来像windowsType包含一个窗口的对象。 有没有人有这个想法? 一旦解决这个问题,我可以将它应用到下面的Drarig的解决scheme。

好吧,我希望能早点把这个给你,但最近忙着工作。 我今天花了一点时间来弄明白,因为我喜欢挖掘我以前从未做过的事情。 这是一个新项目的全班同学。 没有时间把它包装在一个单独的课堂上。 我相信这会得到你所需要的。 比我想象的要难一些,得到正确的句柄,然后发送命令,但是我明白了。 希望对你有帮助。

PS你可以省略一些东西,特别是用于加载的布尔值,这样我就可以将当前值拉回加载,并选中/取消选中CheckBox

注意:这是在Windows 7,8和10上进行了尝试和测试

 Imports Microsoft.Win32 Imports System.Reflection Imports System.Runtime.InteropServices Public Class Form1 <Flags()> _ Public Enum KeyboardFlag As UInteger KEYBOARDF_5 = &H74 End Enum <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ Private Shared Function GetWindow(ByVal hl As Long, ByVal vm As Long) As IntPtr End Function <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Boolean End Function <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr End Function Private blnLoading As Boolean = False Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged Form1.HideFilesExtension(Me.CheckBox1.Checked) If Not blnLoading Then NotifyFileAssociationChanged() RefreshExplorer() End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim name As String = "Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(name, False) blnLoading = True Me.CheckBox1.Checked = CBool(key.GetValue("Hidden")) key.Close() blnLoading = False End Sub Private Shared Sub HideFilesExtension(ByVal Hide As Boolean) Dim name As String = "Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(name, True) key.SetValue("Hidden", If(Hide, 1, 0)) key.Close() End Sub Public Shared Sub RefreshExplorer() Dim clsid As New Guid("13709620-C279-11CE-A49E-444553540000") Dim typeFromCLSID As Type = Type.GetTypeFromCLSID(clsid, True) Dim objectValue As Object = Activator.CreateInstance(typeFromCLSID) Dim obj4 As Object = typeFromCLSID.InvokeMember("Windows", BindingFlags.InvokeMethod, Nothing, objectValue, New Object(0 - 1) {}) Dim type1 As Type = obj4.GetType Dim obj2 As Object = type1.InvokeMember("Count", BindingFlags.GetProperty, Nothing, obj4, Nothing) If (CInt(obj2) <> 0) Then Dim num2 As Integer = (CInt(obj2) - 1) Dim i As Integer = 0 Do While (i <= num2) Dim obj5 As Object = type1.InvokeMember("Item", BindingFlags.InvokeMethod, Nothing, obj4, New Object() {i}) Dim type3 As Type = obj5.GetType Dim str As String = CStr(type3.InvokeMember("Name", BindingFlags.GetProperty, Nothing, obj5, Nothing)) If (str = "File Explorer") Then type3.InvokeMember("Refresh", BindingFlags.InvokeMethod, Nothing, obj5, Nothing) End If i += 1 Loop End If End Sub Public Shared Sub NotifyFileAssociationChanged() 'Find the actual window... Dim hwnd As IntPtr = FindWindow("Progman", "Program Manager") 'Get the window handle and refresh option... Dim j = GetWindow(hwnd, 3) 'Finally post the message... PostMessage(j, 256, KeyboardFlag.KEYBOARDF_5, 3) End Sub End Class 

这是除了资源管理器刷新之外的一切解决方案。 我已经翻译了代码,但是我无法找到如何在不重新启动的情况下刷新浏览器/桌面。

 Const keyName As String = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" Const Hidden As String = "Hidden" Const SHidden As String = "ShowSuperHidden" Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim St As Integer = GetRegValue(Hidden) If St = 2 Then SetRegValue(Hidden, 1) SetRegValue(SHidden, 1) Else SetRegValue(Hidden, 2) SetRegValue(SHidden, 0) End If End Sub Private Function GetRegValue(valueName As String) As Integer Return CInt(My.Computer.Registry.GetValue(keyName, valueName, 0)) End Function Private Sub SetRegValue(valueName As String, value As Integer) My.Computer.Registry.SetValue(keyName, valueName, value, Microsoft.Win32.RegistryValueKind.DWord) End Sub 

我有几个想法来刷新桌面:

  • 发送密钥到正在运行的进程。 我试过这个( 来源 ):

     Dim pp As Process() = Process.GetProcessesByName("explorer") If pp.Length > 0 Then For Each p In pp AppActivate(p.Id) SendKeys.SendWait("{F5}") Next End If 
    • 使用SHChangeNotify ( 源 )刷新,
    • 刷新广播WM_SETTINGCHANGE消息( 源 ),
    • 等等

我想你会被迫手动刷新或重新启动浏览器。