5

スーパーユーザーで受け取った回答に基づいて、カスタムExplorerWindowランチャーに以下を追加する必要があることは明らかです。ルート権限を取得されたエクスプローラービューを起動したいのですが、そのウィンドウだけで、ナビゲーションペインを古いWindowsXPフォルダーペインのように見せます。スタートメニューにこれらのフォルダービューへのショートカットを配置するプログラムを既に作成したので、ランチャーを介して実行するようにショートカットを変更するのは簡単です。

XPフォルダペインは次のとおりです。

WindowsXPExplorerのフォルダペイン

これがWindows7のナビゲーションペインです。

Windows7エクスプローラーのナビゲーションペイン
(出典:280z28.org

4

3 に答える 3

3

さて、私はこのコードを完全に完成させる時間がありません(そして、C#であり、あなたが何を望んでいるのかわかりませんが、実際には指定していませんでした)。これの基本的な前提は、.NETフォーム内でExplorerBrowserコントロールをホストし(参照を取得して追加する必要があるWindowsAPICodePackを使用)、TreeViewが作成されるまで待機し、ウィンドウをサブクラス化して、インターセプトできるようにすることです。アイテムの挿入。

残念ながら、単純なものはありません。テキストでは、アイテムが何であるかを直接知ることはできません(設定されていないため)。必要なのは、からPIDLを取得し、insertStruct.lParamそれを意味のあるものに解析することです。インターフェイスを使用しIShellFolderます。次に、アイテムを選択的に削除し(0をとして返すことによりm.Result)、他に必要なものをすべて傍受できます。あなたは簡単な解決策があると思うでしょうが、私はあなたの運がないことを推測します;)それが少し役立つことを願っています。

別の方法としては、同様の方法(ホストエクスプローラーを直接実行)がありますが、迂回などを使用してレジストリ関数をフックし、エクスプローラーコントロールが取得するビューを選択的に変更して、レジストリの調整の一部を機能させます。

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", CharSet = CharSet.Auto,
         CallingConvention = CallingConvention.StdCall)]
        public static extern bool UnhookWindowsHookEx(IntPtr hHook);

        [DllImport("user32.dll", CharSet = CharSet.Auto,
         CallingConvention = CallingConvention.StdCall)]
        public static extern int CallNextHookEx(IntPtr hHook, int nCode,
        IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll", 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 wParam, 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, nCode, wParam, lParam);                
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {                        
            explorerBrowser1.Navigate(ShellLink.FromParsingName("C:\\"));
        }
    }
}
于 2010-02-03T01:17:02.970 に答える
0

IShellFolderViewDual2ExplorerインスタンスまたはIShellFolderViewDual3インターフェイスへのポインタを取得できる場合は、ViewOptionsメソッドでを指定できますSFVVO_WIN95CLASSIC

于 2010-02-03T02:16:08.857 に答える
-1

Win 7では、要求していることを実行することはできません。つまり、エクスプローラーウィンドウの外観をカスタマイズして、単一のインスタンスのフォルダーツリービューを除くすべてのアイテム(ライブラリ、お気に入りなど)をナビゲーションペインから削除します。エクスプローラーの。ご存知かもしれませんが、これは、システム全体の設定として、レジストリを4か所で変更することで実行できます。または、もっと簡単に、エクスプローラーのプロパティウィンドウのナビゲーションペインで[すべてのフォルダーを表示]を設定できます([お気に入り]リンクがまだ表示されている場合)。ただし、これらは両方ともシステム全体の設定であり、すべてのエクスプローラウィンドウに影響します。

申し訳ありませんが、これでは目的の結果が得られないことは承知していますが、ナビゲーションペインからこれらのアイテムを削除するには、システム全体の設定が唯一のオプションです。(ところで、ここではあなただけではありません-XP Explorerビューを好む人はたくさんいます)。

于 2010-02-02T16:39:17.507 に答える