2010-01-24 2 views
5

내가받은 답변을 바탕으로 superuser에서 사용자 지정 탐색기 실행기에 다음을 추가해야합니다. 루트 탐색기보기를 시작하고 해당 창 탐색 창을 이전 Windows XP 폴더 창처럼 보이게 만듭니다. 나는 이미 wrote a program 시작 메뉴에서 이러한 폴더보기에 바로 가기를 배치하므로 실행 프로그램을 통해 실행되도록 바로 가기를 변경하는 것은 간단합니다. Windows 7 탐색기 조작 창

Windows XP Explorer Folders Pane

여기 윈도우 7 탐색 창 :

가 여기에 XP 폴더 창입니다

당신이 요구하는지 무엇을 할 윈도우 7에서 가능하지 않다

Windows 7 Explorer Navigation Pane http://www.280z28.org/images/NavigationPaneProblems.png

+1

아마 당신이 이것을 원할 이유를 설명 할 수 있습니다. 나는 사용자가 그것을 싫어할 것이라고 생각할 것이다. – PeteT

+1

@ petebob796 : 나는 그것을 사용하여 내가 작업하고있는 프로젝트를 보여주는 특별한 창을 열어 놓을 수있다. 이 프로그램은 시작 메뉴에 "뿌리 낀 모습으로 _____ 폴더를 시작합니다"라는 유틸리티입니다. 그래서 나는 사람들에 대한 설정을 몰래하는 것과 같지 않습니다. –

답변

3

그래,이 코드를 완전히 끝내야 할 시간이 없다. (그리고 C#에서는 내가 원하는 바가 없지만 실제로는 지정하지 않았다.) 이것의 기본 전제는 NET Form 내에서 ExplorerBrowser 컨트롤을 호스팅하는 것입니다 (참조를 가져오고 추가해야하는 WindowsAPICodePack 사용). TreeView가 생성 될 때까지 기다렸다가 윈도우를 서브 클래스하여 가로 채기를 허용합니다. 항목 삽입

유감스럽게도이 텍스트는 항목이 무엇인지 직접적으로 알려주지 않으므로 (설정하지 않았기 때문에) insertStruct.lParam에서 PIDL을 가져 와서 구문 분석해야합니다 의미있는 것으로, 아마 IShellFolder 인터페이스를 사용하십시오. 그런 다음 항목을 선택적으로 제거 할 수 있습니다 (0을 m.Result으로 반환 함). 그러면 필요한 항목을 가로 챌 수 있습니다. 당신은 거기에 간단한 해결책이 될 것이라고 생각하지만, 당신의 운이 아닌 것 같아요;) 희망이 약간 도움이됩니다.

대체 기능 (호스트 탐색기에서 직접)을 수행 할 수도 있지만 detours과 같은 것을 사용하여 레지스트리 기능을 연결하고 탐색기 컨트롤이 일부 레지스트리 조정이 작동하도록 허용하는보기를 선택적으로 변경합니다. 당신이 탐색기 인스턴스의 IShellFolderViewDual2 또는 IShellFolderViewDual3 인터페이스의 포인터를 검색 할 수있는 경우

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:\\")); 
     } 
    } 
} 
+0

감사합니다. 이것이 가능한 해결책 일 수 있습니다. –

+0

안녕하세요.이 코드를 사용하여 잘 작동합니다. 하지만 어떻게 탐색기에서 다른 고통을 숨길 수 있습니다. 즉. 항법 고통. 또한 그것의 오른쪽 상단에 검색 영역을 숨 깁니다. 검색 옵션을 표시 할 수 있습니까? –

-1

, 탐색기 창의 모양을 사용자 정의하여 탐색기의 단일 인스턴스에 대해 폴더 트리 뷰를 제외한 탐색 창에서 모든 항목 (라이브러리, 선호도 등)을 제거합니다. 네 곳에서 레지스트리를 수정하여 시스템 전체 설정으로 발견 할 수 있습니다. 다른 방법으로 간단하게 탐색기의 속성 창에서 탐색 창에 "모든 폴더 표시"를 설정할 수 있습니다 ("즐겨 찾기"링크가 계속 있으면 괜찮습니다). 그러나이 두 가지 모두 시스템 전체 설정이며 모든 탐색기 창에 영향을줍니다.

죄송합니다. 귀하의 정보를 알 수는 없지만 시스템 전체 설정 만 탐색 창에서 이러한 항목을 제거 할 수있는 유일한 옵션입니다. (BTW, 당신은 여기서 혼자가 아닙니다. XP Explorer보기를 선호하는 사람들이 많이 있습니다.)

+1

이 답변은 표준 창 설정에 적용되지만 모든 셸 인터페이스에 적용되는지 확실합니까? 이 시점에서 나는 윈도우의 프로그래밍 방식 조작을하려고합니다. (어떤 점에서 익스플로러 그 자체는 Windows 설정을 검사해야하는데, 이는 최악의 경우 레지스트리를 호출하여 조작 할 수 있음을 의미합니다.) –

+0

예, 레지스트리에있는 모든 신 모드를 확인하고 이러한 사양을 충족시킬 수있는 것은 없습니다. Win7에 대한 그룹 정책 설정은 아직 완전히 문서화되지 않았기 때문에 (AFAIK), GP가 일반적으로 관리자를 위해 훨씬 더 구성 가능하기 때문에 내가 찾고 있었던 또 다른 영역입니다. MSFT가 사용자 설정 구성 관점에서이보기를 모두 제거한다는 것이 이상하게 보입니다. 좀 더 검색을 계속하겠습니다 만 결과가이 견해와 동일하다는 확신이 없습니다. –

+2

나는 그 대답이 COM 인터페이스 깊숙이 있다고 생각합니다. –

0

는 다음 ViewOptions 방법을 사용하면 SFVVO_WIN95CLASSIC을 지정할 수 있습니다.