操作Windows 7资源管理器导航窗格
发布时间:2020-12-14 02:48:15 所属栏目:Windows 来源:网络整理
导读:根据我在 superuser收到的答案,很明显我必须将以下内容添加到自定义资源管理器窗口启动器中.我想启动一个rooted explorer视图,只有那个窗口使导航窗格看起来像旧的Windows XP文件夹窗格.我已经 wrote a program在“开始”菜单上放置了这些文件夹视图的快捷方
根据我在
superuser收到的答案,很明显我必须将以下内容添加到自定义资源管理器窗口启动器中.我想启动一个rooted explorer视图,只有那个窗口使导航窗格看起来像旧的Windows XP文件夹窗格.我已经
wrote a program在“开始”菜单上放置了这些文件夹视图的快捷方式,因此更改快捷方式以通过启动器运行是微不足道的.
这是XP文件夹窗格: 这是Windows 7导航窗格: Windows 7 Explorer Navigation Pane http://www.280z28.org/images/NavigationPaneProblems.png 解决方法
好吧,我没有时间完全完成这个代码(它在C#中,我不知道你想要什么,但你没有真正指定).这个的基本前提是在.NET表单中托管ExplorerBrowser控件(使用你需要获取的
WindowsAPICodePack并添加引用),等待创建TreeView并继承窗口以允许我们拦截项目插入.
遗憾的是,没有什么是简单的,文本没有让你直接了解项目是什么(因为他们没有设置它),你需要做的是从insertStruct.lParam获取PIDL并将其解析为某些东西有意义的,可能使用IShellFolder接口.然后,您可以有选择地删除项目(通过返回0作为m.Result),您可以拦截您需要的任何其他内容.你会认为会有一个简单的解决方案,但我猜你的运气不在;)希望它有点帮助. 另一种方法可能是类似的(主机资源管理器直接),但使用类似detours的东西来挂钩注册表函数并有选择地更改浏览器控件获取的视图,允许一些注册表调整工作. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.WindowsAPICodePack.Shell; using System.Runtime.InteropServices; namespace MyExplorer { public partial class Form1 : Form { const int WH_CALLWNDPROC = 4; const int WM_CREATE = 1; public delegate int HookProc(int nCode,IntPtr wParam,IntPtr lParam); [DllImport("user32.dll",CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)] public static extern IntPtr SetWindowsHookEx(int idHook,HookProc lpfn,IntPtr hInstance,int threadId); [DllImport("user32.dll",CallingConvention = CallingConvention.StdCall)] public static extern bool UnhookWindowsHookEx(IntPtr hHook); [DllImport("user32.dll",CallingConvention = CallingConvention.StdCall)] public static extern int CallNextHookEx(IntPtr hHook,int nCode,SetLastError = true,CharSet = CharSet.Auto)] static extern int GetClassName(IntPtr hWnd,StringBuilder lpClassName,int nMaxCount); IntPtr m_hHook; HookProc HookDelegate; struct WindowHookStruct { public IntPtr lParam; public IntPtr wParam; public uint message; public IntPtr hwnd; } public class SubclassTreeView : NativeWindow { const int TV_FIRST = 0x1100; //const int TVM_INSERTITEMA = (TV_FIRST + 0); const int TVM_INSERTITEMW = (TV_FIRST + 50); struct TVINSERTSTRUCTW { public IntPtr hParent; public IntPtr hInsertAfter; /* TVITEMW */ public uint mask; public IntPtr hItem; public uint state; public uint stateMask; public IntPtr pszText; public int cchTextMax; public int iImage; public int iSelectedImage; public int cChildren; public IntPtr lParam; } int count = 0; protected override void WndProc(ref Message m) { bool bHandled = false; switch (m.Msg) { case TVM_INSERTITEMW: TVINSERTSTRUCTW insertStruct = (TVINSERTSTRUCTW)Marshal.PtrToStructure(m.LParam,typeof(TVINSERTSTRUCTW)); /* Change text to prove a point */ string name = String.Format("{0:X} {1} Hello",insertStruct.hParent.ToInt64(),count++); insertStruct.pszText = Marshal.StringToBSTR(name); insertStruct.cchTextMax = name.Length+1; Marshal.StructureToPtr(insertStruct,m.LParam,false); /* insertStruct.lParam is a pointer to a IDL,use IShellFolder::GetDisplayNameOf to pull out a sensible name to work out what to hide */ /* Uncomment this code to delete the entry */ //bHandled = true; //m.Result = IntPtr.Zero; break; } if (!bHandled) { base.WndProc(ref m); } } } /* Not complete structure,don't need it */ struct MSG { public IntPtr hwnd; public uint message; public IntPtr wParam; public IntPtr lParam; } SubclassTreeView sc = null; public Form1() { InitializeComponent(); HookDelegate = new HookProc(HookWindowProc); m_hHook = SetWindowsHookEx(WH_CALLWNDPROC,HookDelegate,(IntPtr)0,AppDomain.GetCurrentThreadId()); } int HookWindowProc(int nCode,IntPtr lParam) { if (nCode < 0) { return CallNextHookEx(m_hHook,nCode,wParam,lParam); } else { WindowHookStruct hookInfo = (WindowHookStruct)Marshal.PtrToStructure(lParam,typeof(WindowHookStruct)); StringBuilder sb = new StringBuilder(1024); if (hookInfo.message == WM_CREATE) { if (GetClassName(hookInfo.hwnd,sb,1024) > 0) { System.Diagnostics.Debug.WriteLine(sb.ToString()); if (sb.ToString() == "SysTreeView32") { sc = new SubclassTreeView(); sc.AssignHandle(hookInfo.hwnd); UnhookWindowsHookEx(m_hHook); } } } return CallNextHookEx(m_hHook,lParam); } } private void Form1_Load(object sender,EventArgs e) { explorerBrowser1.Navigate(ShellLink.FromParsingName("C:")); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Windows安装程序 – Windows错误2356
- BAT脚本将文件从Windows复制到远程Linux系统
- windows-server-2003 – 永久绑定的iSCSI卷在重新引导时不会
- windows-7 – 将自己锁定在组策略编辑器之外
- Windows中的C是否有简单的Program Files / Program Files(x
- Windows – 在Dell PowerEdge R410上安装操作系统时出现问题
- 单引号字符串到uint在c#
- msmq – 有没有办法只查看计算机管理的消息队列部分?
- windows-server-2008 – PCI合规性:文件完整性检查程序[已
- windows-vista – 运行Vista的HP z800在Windows Update之后
推荐文章
站长推荐
- windows-server-2008-r2 – 来自perfmon Windows
- 在IIS日志文件夹上使用NTFS压缩是一种好习惯吗?
- windows-xp – Windows BSOD故障排除告诉我“驱动
- windows-xp – 如何在多台Windows XP计算机上远程
- Vulkan Tutorial 07 Window surface
- windows-server-2008 – DC复制问题
- windows-phone-7 – 如何删除IE移动浏览器的点击
- Windows – IIS 7.5 – 更新web.config时禁用不重
- environment variable is too large 2047
- 故意破坏我的Windows应用程序的最佳方法是什么?
热点阅读