加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

操作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:"));
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读