2011-11-04 17 views
12

Estoy tratando de mostrar la barra de herramientas de direcciones desde la barra de tareas de Windows en mi propio WinForm. Puedo obtener el CLSID de la barra de direcciones ({01E04581-4EEE-11d0-BFE9-00AA005B4383}) y puedo obtener una referencia de IDeskBand. ¿Pero entonces, qué?Host IDeskBand en un formulario de Windows

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

he tratado de alojamiento en un AxHost, pero la barra de herramientas de dirección no es un control ActiveX. He intentado llamar

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

o

(deskband as IDockingWindow).ShowDW(true); 

, así como varias otras interfaces y sus métodos, pero nada que hago parece llegar a ninguna parte. Me encantaría si realmente pudiera ver esa barra de herramientas aparecer en cualquier lugar. Pero parece que no puedo cerrar la brecha entre tener la referencia IDeskBand y conectarla a mi Windows Form.

¿Alguien ha intentado esto antes, y ha llegado más lejos que yo?

+0

¿Puede proporcionar más información sobre qué funcionalidad necesita de AddressBarbar DeskBand? Esta interfaz quedó obsoleta a partir de Windows 7, por lo que es posible que no sea compatible en futuras versiones de Windows. –

+0

Quiero poder poner la Address deskband, y otras deskbands como Links o incluso personalizadas, en mi WinForm, y hacer que aparezcan como lo hacen en la barra de tareas. – deanis

+0

Así que tal vez no es un 'IDeskBand' que quiero implementar. Estoy bastante seguro de que las barras de herramientas de Direcciones y Enlaces son objetos COM de DeskBand, por lo que hice el salto a 'IDeskBand'. Entonces, lo que realmente intento hacer es consultar el objeto COM objetivo, lo cual puedo hacer para obtener el Guid correspondiente, la instancia, lo cual hago con 'Activator.CreateInstance'. Donde las cosas se me están cayendo es cuando trato de dar el salto al hosting del objeto COM en mi WinForm. – deanis

Respuesta

1

No creo que esto sea compatible, ya que se supone que DeskBand debe ser hospedado por Explorer, pero aquí hay un ejemplo de código de formulario que demuestra cómo hacerlo y debería ayudarlo a comenzar.

La idea es que debe ser el "Sitio", en lugar de Explorer. Si mira la documentación aquí Creating Custom Explorer Bars, Tool Bands, and Desk Bands, debe asegurarse de que su código se comporte como se comporta Explorer. Entonces, lo primero que hay que hacer es dar una implementación de "Sitio" al objeto de banda de escritorio, y la primera interfaz que esta implementación necesita proporcionar es IOleWindow. El objeto de banda de escritorio le preguntará a su "Sitio" qué maneja Windows padre. Sólo dar el mango de la forma (por ejemplo) y la banda de recepción se mostrará a sí mismo como el hijo de un formulario:

enter image description here

NOTA: No se puede utilizar cualquier forma o tipo de control como el implementador IOleWindow porque ya está la implementación detrás de la escena (implementación de Winforms), y esta implementación es muy específica, por lo que necesitará un sitio personalizado como se demuestra aquí.

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

¡Bien humos sagrados, eso funcionó! Acabo de alojar la barra de herramientas Dirección, y luego la barra de herramientas del Panel de entrada de Tablet PC. Por alguna razón, Links no funciona para mí. Si tienes alguna idea de por qué es así, tomaría algunos consejos. También tengo que descubrir cómo cambiar el tamaño de estos controles, pero al menos puedo verlos ahora. Gracias Simon! – deanis

+0

¿Alguien tiene alguna idea de cómo cambiaría el tamaño de esta barra de herramientas? He intentado un montón de llamadas diferentes, pero no he tenido suerte. – deanis

Cuestiones relacionadas