vb.net – 复制Windows取消隐藏文件夹和文件功能
我再次访问一个工具,我在VB.Net写了我的服务支持团队而回,想添加一些复选框复制
Windows用来显示隐藏的文件和文件夹/再隐藏相同的功能,以及受保护的操作系统文件.
我知道我可以通过编辑注册表项并重新启动explorer.exe来完成此操作,但这会关闭所有打开的资源管理器Windows,我不希望这样. 有没有人知道Windows是如何通过简单点击一个复选框以及我如何能够在VB.net中编码它来做到这一点的? 对此的任何意见都提前非常感谢. 编辑:那么它看起来像我发现作品刷新Windows资源管理器/文件浏览器,可应用于以下Drarig的答案,但我无法将其转换为VB.net作为原始的例子是在C#中的刷新方法. 'Original at https://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,windows,Nothing) For i As Integer = 0 To CType(count,Integer) Dim item As Object = windowsType.InvokeMember("Item",New Object() {i}) Dim itemType As Type = item.GetType() 'Only fresh Windows explorer Windows Dim itemName As String = CType(itemType.InvokeMember("Name",item,Nothing),String) If itemName = explorerType Then itemType.InvokeMember("Refresh",Nothing) End If Next End Sub 当我将itemType设置为上面的Type = item.GetType()时,我得到一个异常对象引用未设置为对象的实例.我无法弄清楚哪个对象没有被创建.当我单步执行代码时,它看起来像windowsType包含一个对象.有没有人对此有任何想法?一旦解决了这个问题,我就可以将它应用到下面的Drarig解决方案中. 解决方法
好吧,我希望我能早点得到你,但最近忙于工作.今天我花了一点时间来弄清楚这一点,因为我喜欢挖掘我之前没有做过的事情.这是一个新项目的全班;没有时间把它包装在一个单独的课堂上.我相信这会得到你所需要的.它比我想象的更难获得正确的句柄然后发送命令,但我得到了它.希望对你有帮助.
附:你可以省略一些东西,特别是用于加载的布尔值,这样我就可以在加载时拉回当前值并检查/取消选中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",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",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 = "SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced" 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 = "SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced" 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,objectValue,New Object(0 - 1) {}) Dim type1 As Type = obj4.GetType Dim obj2 As Object = type1.InvokeMember("Count",BindingFlags.GetProperty,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",New Object() {i}) Dim type3 As Type = obj5.GetType Dim str As String = CStr(type3.InvokeMember("Name",obj5,Nothing)) If (str = "File Explorer") Then type3.InvokeMember("Refresh",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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |