2010-01-24 13 views
5

superuser पर प्राप्त उत्तरों के आधार पर, यह स्पष्ट है कि मुझे कस्टम एक्सप्लोरर विंडो लॉन्चर में निम्नलिखित जोड़ना होगा। मैं एक रूट एक्सप्लोरर व्यू लॉन्च करना चाहता हूं, और के लिए बस उस विंडो नेविगेशन फलक पुराने विंडोज एक्सपी फ़ोल्डर्स फलक की तरह दिखता है। स्टार्ट मेनू पर इन फ़ोल्डर दृश्यों के लिए शॉर्टकट रखने के लिए मैं पहले से ही wrote a program है, इसलिए लॉन्चर के माध्यम से चलाने के लिए शॉर्टकट बदलना मामूली है। विंडोज 7 एक्सप्लोरर नेविगेशन फलक को मैनिपुलेट करना

Windows XP Explorer Folders Pane

यहाँ विंडोज 7 नेविगेशन पेन:

यहाँ XP फ़ोल्डरों फलक है

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

+1

शायद आप समझा सकते हैं कि आप ऐसा क्यों करना चाहते हैं। मुझे लगता है कि एक उपयोगकर्ता इसे नफरत करेगा। – PeteT

+1

@ petebob796: मैं इसका उपयोग करता हूं इसलिए मेरे पास एक विशेष खिड़की खुली हो सकती है जो दिखाती है कि मैं जिस परियोजना पर काम कर रहा हूं। कार्यक्रम एक उपयोगिता है जिसे मैं प्रारंभ मेनू पर "मूल दृश्य के साथ फ़ोल्डर _____ लॉन्च करने" के लिए रखता हूं, इसलिए ऐसा नहीं है कि मैं लोगों पर सेटिंग को छीन रहा हूं। –

उत्तर

3

ठीक है मुझे इस कोड को पूरी तरह खत्म करने का समय नहीं मिला है (और यह सी # में है जो मुझे नहीं पता कि आप क्या चाहते हैं, लेकिन आपने वास्तव में निर्दिष्ट नहीं किया है)। इसका मूल आधार एक .NET फॉर्म के अंदर एक्सप्लोरर ब्राउजर नियंत्रण को होस्ट कर रहा है (WindowsAPICodePack का उपयोग करके आपको संदर्भ प्राप्त करने और जोड़ने की आवश्यकता होगी), ट्री व्यू को तब तक प्रतीक्षा करें जब तक कि ट्री व्यू बनाया गया हो और खिड़की को उपclass करने के लिए हमें अनुमति देने के लिए अनुमति दें आइटम सम्मिलन

दुर्भाग्यवश कुछ भी सरल नहीं है, पाठ आपको आइटम के बारे में सीधा विचार नहीं देता है (क्योंकि वे इसे सेट नहीं करते हैं), आपको पीआईडीएल को insertStruct.lParam से प्राप्त करना होगा और इसे पार्स करना होगा कुछ अर्थपूर्ण में, शायद IShellFolder इंटरफ़ेस का उपयोग कर। फिर आप चुनिंदा वस्तुओं को हटा सकते हैं (m.Result के रूप में 0 लौटकर) और आप जिस चीज की आवश्यकता है उसे रोक सकते हैं। आपको लगता है कि एक आसान समाधान होगा लेकिन मुझे लगता है कि आपकी किस्मत नहीं है;) उम्मीद है कि इससे थोड़ा सा मदद मिलेगी।

एक वैकल्पिक समान (मेजबान एक्सप्लोरर सीधे) कर रहा हो सकता है लेकिन 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", 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

यह 7 विन में संभव है कि तुम क्या पूछ रहे हैं क्या करने के लिए नहीं है, यानी एक्सप्लोरर के एक उदाहरण के लिए फ़ोल्डर्स ट्रीव्यूव को छोड़कर, एनएवी फलक से सभी वस्तुओं (पुस्तकालयों, पक्षियों, आदि) को हटाने के लिए एक्सप्लोरर विंडो की उपस्थिति को कस्टमाइज़ करें। 4 स्थानों में रजिस्ट्री को संशोधित करके, आप ऐसा कर सकते हैं, जैसा कि आपने सिस्टम-व्यापी सेटिंग के रूप में खोजा होगा। वैकल्पिक रूप से और अधिक सरलता से, आप एक्सप्लोरर की प्रॉपर्टी विंडो में एनएवी फलक में "सभी फ़ोल्डर्स दिखाएं" सेट कर सकते हैं (यदि आप अभी भी "पसंदीदा" लिंक के साथ ठीक हैं)। हालांकि, ये दोनों सिस्टम-व्यापी सेटिंग्स हैं और सभी एक्सप्लोरर विंडोज़ को प्रभावित करेंगे।

क्षमा करें, मुझे पता है कि यह आपको प्राप्त नहीं करता है कि आप क्या कर रहे हैं, लेकिन सिस्टम-वाइड सेटिंग्स एनवी फलक से इन आइटम्स को हटाने के लिए आपके एकमात्र विकल्प हैं। (बीटीडब्ल्यू, आप यहां अकेले नहीं हैं - बहुत सारे लोग हैं जो एक्सपी एक्सप्लोरर व्यू पसंद करते हैं)।

+1

मुझे पता है कि यह उत्तर मानक विंडोज सेटिंग्स पर लागू होता है, लेकिन क्या आप वाकई सभी शैल इंटरफेस पर लागू होते हैं? इस बिंदु पर मैं खिड़की का प्रोग्रामेटिक हेरफेर करना चाहता हूं। (किसी बिंदु पर एक्सप्लोरर को खुद को विंडोज सेटिंग्स की जांच करनी होती है, जिसका मतलब है कि सबसे बुरी स्थिति में इसे रजिस्ट्री में अपनी कॉल को जोड़कर छेड़छाड़ की जा सकती है।) –

+0

हाँ, मैं रजिस्ट्री में किसी भी भगवान-मोड की जांच कर रहा हूं इन चश्मा को पूरा करने वाला कोई भी नहीं मिला। Win7 के लिए समूह नीति सेटिंग्स अभी तक पूरी तरह से प्रलेखित नहीं हैं (AFAIK), इसलिए यह एक और क्षेत्र है जिसे मैं खोज रहा हूं क्योंकि जीपी आम तौर पर व्यवस्थापक के लिए अधिक विन्यास योग्य है। यह अजीब लगता है कि एमएसएफटी इस दृश्य को उपयोगकर्ता-सेटिंग कॉन्फ़िगरेशन दृष्टिकोण से एक साथ हटा देगा। मैं थोड़ा और खोज कर रहा हूं, लेकिन मुझे विश्वास नहीं है कि परिणाम इस दृश्य के बराबर होंगे। –

+2

मुझे लगता है कि उत्तर COM इंटरफेस में गहराई का जवाब है। –

0

आप एक्सप्लोरर उदाहरण के IShellFolderViewDual2 या IShellFolderViewDual3 इंटरफ़ेस करने के लिए एक सूचक प्राप्त कर सकते हैं, तो ViewOptions विधि आप SFVVO_WIN95CLASSIC निर्दिष्ट कर सकते हैं।

संबंधित मुद्दे