2011-11-04 9 views
12

मैं अपने स्वयं के WinForm में विंडोज टास्कबार से पता टूलबार प्रदर्शित करने की कोशिश कर रहा हूं। मैं पता toobar ({01E04581-4EEE-11d0-BFE9-00AA005B4383}) का सीएलएसआईडी प्राप्त कर सकता हूं, और मुझे इसके संदर्भ में IDeskBand मिल सकता है। लेकिन ... तो क्या?विंडोज़ फॉर्म में होस्ट आईडीस्क बैंड

Guid bandCLSID = new Guid("{01E04581-4EEE-11d0-BFE9-00AA005B4383}"); 
Type bandType = Type.GetTypeFromCLSID(bandCLSID); 
IDeskBand deskband = (IDeskBand)Activator.CreateInstance(bandType); 

मैं एक AxHost में यह होस्टिंग की कोशिश की है, लेकिन पता उपकरण पट्टी एक एक्टिव एक्स नियंत्रण नहीं है। मैं

(deskband as IOleObjectWithSite).SetSite(various interfaces); 

या

(deskband as IDockingWindow).ShowDW(true); 

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

क्या किसी ने पहले इसका प्रयास किया है, और मेरे पास आगे है?

+0

क्या आप पता टूलबार डेस्कबैंड से आपको किस कार्यक्षमता की आवश्यकता है, इस बारे में अधिक जानकारी प्रदान कर सकते हैं? यह इंटरफ़ेस विंडोज 7 के रूप में बहिष्कृत किया गया था, इसलिए इसे विंडोज के भविष्य के संस्करणों में समर्थित नहीं किया जा सकता है। –

+0

मैं अपने WinForm में पता डेस्कबैंड, और लिंक या यहां तक ​​कि कस्टम वाले अन्य डेस्क को रखने में सक्षम होना चाहता हूं, और उन्हें टास्कबार पर दिखाई देने जैसा दिखाना है। – deanis

+0

तो शायद यह एक 'आईडीस्क बैंड' नहीं है जिसे मैं कार्यान्वित करना चाहता हूं। मुझे पूरा यकीन है कि पता और लिंक टूलबार डेस्कबैंड COM ऑब्जेक्ट्स हैं, इसलिए मैंने 'आईडीस्क बैंड' पर कूद किया है। तो मैं वास्तव में क्या करने की कोशिश कर रहा हूं वह लक्ष्य COM ऑब्जेक्ट से पूछताछ करता है, जो मैं मेलिंग ग्रिड प्राप्त करने के लिए कर सकता हूं, इसे तुरंत चालू करें, जो मैं 'एक्टिवेटर। क्रिएट इंस्टेंस' के साथ करता हूं। जहां मेरे लिए चीजें अलग हो रही हैं, जब मैं अपने WinForm में COM ऑब्जेक्ट को होस्ट करने के लिए कूदने का प्रयास करता हूं। – deanis

उत्तर

1

मुझे नहीं लगता कि यह समर्थित है, क्योंकि डेस्कबैंड एक्सप्लोरर द्वारा होस्ट किया जाना चाहिए, लेकिन यहां एक नमूना फॉर्म कोड है जो दर्शाता है कि इसे कैसे करें और आपको प्रारंभ करने में मदद करनी चाहिए।

विचार यह है कि आपको एक्सप्लोरर के बजाय "साइट" होने की आवश्यकता है। यदि आप Creating Custom Explorer Bars, Tool Bands, and Desk Bands पर प्रलेखन को देखते हैं, तो आपको यह सुनिश्चित करना होगा कि आपका कोड एक्सप्लोरर व्यवहार जैसा व्यवहार करता है। तो, मुट्ठी बात करना डेस्क बैंड ऑब्जेक्ट को "साइट" कार्यान्वयन देना है, और इस कार्यान्वयन के पहले इंटरफेस को IOleWindow प्रदान करना है। डेस्क बैंड ऑब्जेक्ट आपकी "साइट" से पूछेगा कि पैरेंट विंडोज हैंडल क्या है। बस (उदाहरण के लिए) प्रपत्र की संभाल देने के लिए और डेस्क बैंड एक प्रपत्र के बच्चे के रूप में खुद को प्रदर्शित करेगा:

enter image description here

ध्यान दें: आप IOleWindow implementer के रूप में किसी भी रूप या नियंत्रण वर्ग का उपयोग नहीं कर सकते क्योंकि यह पहले से ही लागू करने की है यह दृश्य (विनफॉर्म कार्यान्वयन) के पीछे है, और यह कार्यान्वयन बहुत विशिष्ट है, इसलिए आपको यहां प्रदर्शित एक कस्टम साइट की आवश्यकता होगी।

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     private IObjectWithSite _band = (IObjectWithSite)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("{01E04581-4EEE-11d0-BFE9-00AA005B4383}"))); 
     private BandSite _site; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     protected override void CreateHandle() 
     { 
      base.CreateHandle(); 
      if (_site == null) 
      { 
       _site = new BandSite(Handle); 
       _band.SetSite(_site); 
      } 
     } 

     private class BandSite : IOleWindow 
     { 
      private IntPtr _hwnd; 

      public BandSite(IntPtr hwnd) 
      { 
       _hwnd = hwnd; 
      } 

      void IOleWindow.GetWindow(out IntPtr hwnd) 
      { 
       hwnd = _hwnd; 
      } 

      void IOleWindow.ContextSensitiveHelp(int fEnterMode) 
      { 
       throw new NotImplementedException(); 
      } 
     } 
    } 

    [ComImport, Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    public interface IObjectWithSite 
    { 
     void SetSite([MarshalAs(UnmanagedType.IUnknown)] object pUnkSite); 

     [return: MarshalAs(UnmanagedType.IUnknown)] 
     object GetSite(ref Guid riid); 
    } 

    [ComImport, Guid("00000114-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    public interface IOleWindow 
    { 
     void GetWindow(out IntPtr hwnd); 
     void ContextSensitiveHelp(int fEnterMode); 
    } 
} 
+0

अच्छी तरह से पवित्र धूम्रपान, काम किया! मैंने बस पता टूलबार और फिर टैबलेट पीसी इनपुट पैनल टूलबार की मेजबानी की। किसी कारण से, लिंक मेरे लिए काम नहीं कर रहा है। यदि आपको कोई विचार है कि ऐसा क्यों है, तो मैं कोई सुझाव लेता हूं। मुझे यह भी पता लगाना होगा कि इन नियंत्रणों का आकार कैसे बदलें, लेकिन कम से कम मैं उन्हें अब देख सकता हूं। धन्यवाद साइमन! – deanis

+0

किसी को भी कोई विचार है कि मैं इस टूलबार का आकार कैसे बदलूंगा? मैंने अलग-अलग कॉलों का एक गुच्छा करने की कोशिश की है, लेकिन कोई भाग्य नहीं है। – deanis

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