2011-11-04 22 views
12

Adres araç çubuğunu Windows Görev Çubuğundan kendi WinForm'umda göstermeye çalışıyorum. Adresinin ({01E04581-4EEE-11d0-BFE9-00AA005B4383}) CLSID değerini alabilirim ve bir IDeskBand referansı alabilirim. Ama sonra ne?Bir Windows Formunda Host IDeskBand

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

Bir AxHost onu barındıran denedim ama Adres araç bir ActiveX denetimi değildir. Ben

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

veya

(deskband as IDockingWindow).ShowDW(true); 

yanı sıra

diğer çeşitli arabirimler ve bunların yöntemleri arama denedim ama yapmam şey her yerde beni almak gibi görünüyor. Bu araç çubuğunun herhangi bir yerde göründüğünü görürsem çok sevinirim. Ancak, IDeskBand referansı ile Windows Formum'a takma arasındaki boşluğu kapatıyor gibi görünmüyor.

Daha önce hiç kimse buna teşebbüs etti ve sahip olduğumdan daha fazlasını aldı mı?

+0

Adres Araç Çubuğu DeskBand'inden hangi işlevselliğe ihtiyaç duyduğunuz hakkında daha fazla bilgi verebilir misiniz? Bu arabirim Windows 7'den itibaren kullanımdan kaldırıldı, dolayısıyla Windows'un gelecekteki sürümlerinde de desteklenmeyebilir. –

+0

Adres deskband'ını ve Bağlantılar gibi diğer masaüstü bantlarını veya hatta özel olanları WinForm'uma yerleştirmek ve Görev Çubuğunda olduğu gibi görünmelerini istiyorum. – deanis

+0

Yani belki de uygulamak istediğim bir IDeskBand değil. Eminim Adres ve Bağlantılar araç çubukları DeskBand COM nesneleridir, bu yüzden IDeskBand'a atlamayı yaptım. Yani gerçekten yapmaya çalıştığım hedef COM nesnesini sorgulamaktır, ki bu, Activator.CreateInstance ile yaptığım eşleşen Guid'i elde etmek için yapabilirim. WinForm'umdaki COM nesnesini barındırmak için atlamayı denediğimde işler benim için ayrı düşüyor. – deanis

cevap

1

Bir DeskBand'in Explorer tarafından barındırılmasının beklendiği, bunun desteklendiğini düşünmüyorum, ancak burada nasıl yapacağınızı gösteren ve başlamanıza yardımcı olması gereken örnek bir Form kodu var.

Fikir, Explorer yerine "Site" olmanız gerekiyor. Buradaki belgelere bakarsanız Creating Custom Explorer Bars, Tool Bands, and Desk Bands, kodunuzun Explorer gibi davrandığından emin olmanız gerekir. Yani, yapılacak en önemli şey, masa bandı nesnesine bir "Site" uygulaması vermektir ve bu uygulamanın sağlaması gereken ilk arayüz IOleWindow'dur. Masa grubu nesnesi, "Site" nizi ana pencerelerin ne işleyeceğini soracaktır. Sadece (örneğin) formun kolunu vermek ve masa bant bir form'ın çocuk olarak kendini gösterecektir:

enter image description here

NOT: Zaten uygulayan çünkü Sen IOleWindow uygulamacı olarak herhangi Formu veya Kontrol sınıfını kullanamazsınız Sahnenin arkasındaki (Winforms uygulaması) ve bu uygulama çok özeldir, bu nedenle burada gösterildiği gibi özel bir siteye ihtiyacınız olacak.

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

İyi işitin, işe yaradı! Sadece Adres araç çubuğunu ve ardından Tablet PC Giriş Paneli araç çubuğunu barındırdım. Bazı nedenlerle, Bağlantılar benim için çalışmıyor. Bunun neden olduğu hakkında bir fikrin varsa, herhangi bir ipucu alırdım. Bu kontrollerin nasıl yeniden boyutlandırılacağını da anlamaya çalışıyorum, ama en azından şimdi onları görebiliyorum. Teşekkürler Simon! – deanis

+0

Bu araç çubuğunu nasıl yeniden boyutlandıracağım hakkında bir fikrim var mı? Bir sürü farklı arama denedim, ama hiç şansın olmadı. – deanis

İlgili konular