我正在重新审视我以前为我的帮助台团队编写的VB.Net工具,并希望添加一些复选框来复制Windows使用的同一功能,以显示隐藏文件和文件夹/重新隐藏以及受保护的操作系统文件。
我在将 itemType设为Type = item.GetType() 时,出现了一个异常: 对象引用未设置为对象的实例。我无法确定哪个对象没有被创建。当我逐步执行代码时,看起来 windowsType 包含了 windows 的一个对象。有人对此有什么想法吗?一旦解决了这个问题,我就可以应用Drarig下面的解决方案。
我知道我可以通过编辑注册表项并重新启动explorer.exe来实现这一点,但这会关闭所有打开的资源管理器窗口,我不想这样做。
有人知道Windows如何通过简单的复选框单击来实现这一点,以及我如何在VB.net中编写它吗?
非常感谢您提前提供任何关于此的意见。
编辑:看起来我已经找到了一个刷新方法,可用于刷新Windows资源管理器/文件资源管理器,可以应用于下面Drarig的答案,但我在将其转换为VB.net时遇到了问题,因为原始示例是C#。
'Original at https://dev59.com/e3E95IYBdhLWcg3wCJXk
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下面的解决方案。