vb.net - 复制 Windows 取消隐藏文件夹和文件功能

标签 vb.net windows show-hide

我正在重新访问我在 VB.Net 中为我的帮助台团队编写的一个工具,我想添加几个复选框来复制 Windows 用来显示隐藏文件和文件夹的相同功能/重新隐藏以及 protected 操作系统文件。

我知道我可以通过编辑注册表项并重新启动 explorer.exe 来完成此操作,但这会关闭所有打开的资源管理器窗口,我不希望这样。

有谁知道 Windows 是如何通过简单地单击复选框来执行此操作的,以及我如何能够在 VB.net 中对其进行编码吗?

提前非常感谢对此的任何意见。


编辑:看来我找到了一种刷新 Windows 资源管理器/文件资源管理器的刷新方法,它可以应用于下面 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() 时,出现异常未设置对象实例> 以上。我不知道哪个对象没有被创建。当我单步执行代码时,它看起来像 windowsType 包含一个用于 windows 的对象。有人对此有任何想法吗?一旦解决了这个问题,我就可以将其应用到下面 Drarig 的解决方案中。

最佳答案

好吧,我希望我能早点把这个给你,但最近工作很忙。我今天花了一点时间来解决这个问题,因为我喜欢深入研究我以前没有做过的事情。这是一个新项目的全类;没有时间把它放在一个单独的类(class)中。我相信这将为您提供所需的东西。获得正确的句柄然后发送命令比我想象的要难一些,但我明白了。我希望你觉得它有用。

附言您可以省略一些内容,特别是用于加载的 bool 值,这样我就可以在加载时拉回当前值并选中/取消选中 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

关于vb.net - 复制 Windows 取消隐藏文件夹和文件功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32234984/

相关文章:

windows - 为什么 Windows 不被认为适合实时系统/高性能服务器?

windows - windows导入opencv

windows - 用于多服务器管理员的可移植脚本语言?

jquery - 根据所选选项显示/隐藏多个 div - 几乎就在那里

javascript - 检查元素是否正在淡出 (Javascript/Jquery)

c# - C# 或 VB.NET 中的 std::bind 等价物

vb.net - 您可以忽略 Resharper 中特定的冗余限定符吗?

jquery - 显示/隐藏由插件创建的 ol

vb.net - 如何在vs2010宏中使用“ReSharper.ReSharper_SilentCleanupCode”?

c# - 二维码定制尺寸