2011-11-04 9 views
12

Sto tentando di visualizzare la barra degli indirizzi dalla barra delle applicazioni di Windows nel mio WinForm. Posso ottenere il CLSID del toobar Address ({01E04581-4EEE-11d0-BFE9-00AA005B4383}) e posso ottenere un riferimento a IDeskBand. Ma ... allora cosa?Host IDeskBand in un Windows Form

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

ho provato lo ospita in un AxHost, ma la barra degli strumenti indirizzo non è un controllo ActiveX. Ho provato a chiamare

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

o

(deskband as IDockingWindow).ShowDW(true); 

così come varie altre interfacce e dei loro metodi, ma niente che faccio sembra di farmi da nessuna parte. Sarei felicissimo se potessi effettivamente vedere quella barra degli strumenti apparire ovunque. Ma non riesco a colmare il divario tra avere il riferimento IDeskBand e collegarlo al mio Windows Form.

Qualcuno ha tentato questo prima, e ottenuto più lontano di me?

+0

È possibile fornire ulteriori informazioni su quali funzionalità sono necessarie dalla barra degli indirizzi di DeskBand? Questa interfaccia è stata dichiarata obsoleta a partire da Windows 7, quindi potrebbe non essere supportata comunque nelle future versioni di Windows. –

+0

Desidero essere in grado di inserire la mia Scrivania indirizzo e altri deskbands come Collegamenti o anche personalizzati, nel mio WinForm e visualizzarli come fanno sulla barra delle applicazioni. – deanis

+0

Quindi forse non è un 'IDeskBand' che voglio implementare. Sono abbastanza sicuro che le barre degli indirizzi e dei collegamenti siano oggetti COM DeskBand, motivo per cui ho fatto il salto a 'IDeskBand'. Quindi quello che sto provando a fare è interrogare l'oggetto COM di destinazione, che posso fare per ottenere il Guid corrispondente, l'istanza, che faccio con 'Activator.CreateInstance'. Dove le cose stanno cadendo a pezzi per me è quando tento di fare il salto per ospitare l'oggetto COM nel mio WinForm. – deanis

risposta

1

Non penso che questo sia supportato, in quanto un DeskBand dovrebbe essere ospitato da Explorer, ma qui c'è un codice di esempio che dimostra come farlo e dovrebbe aiutare a iniziare.

L'idea è che devi essere il "Sito", anziché Explorer. Se si guarda la documentazione qui Creating Custom Explorer Bars, Tool Bands, and Desk Bands, è necessario assicurarsi che il proprio codice si comporti come si comporta Explorer. Quindi, la prima cosa da fare è dare un'implementazione "Site" all'oggetto band desk, e la prima interfaccia che questa implementazione deve fornire è IOleWindow. L'oggetto della banda di lavoro chiederà al tuo "Sito" che cosa gestisce la finestra principale. Basta dare l'handle della maschera (per esempio) e la band scrivania mostrerà se stesso come figlio di un modulo:

enter image description here

NOTA: Non è possibile utilizzare qualsiasi modulo o la classe di controllo come il realizzatore IOleWindow perché è già attuazione dietro la scena (implementazione di Winforms), e questa implementazione è molto specifica, quindi avrai bisogno di un sito personalizzato come dimostrato qui.

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

Bene santo fuma, ha funzionato! Ho appena ospitato la barra degli strumenti Indirizzo e quindi la barra degli strumenti Pannello input penna di Tablet PC. Per qualche ragione, Links non funziona per me. Se hai qualche idea del perché, prendo qualche consiglio. Devo anche capire come ridimensionare questi controlli, ma almeno posso vederli ora. Grazie Simone! – deanis

+0

Qualcuno ha idea di come ridimensionare questa barra degli strumenti? Ho provato un sacco di chiamate diverse, ma non ho avuto fortuna. – deanis