¿Cómo puedo decirle programáticamente a la barra de tareas de Windows que abra (o cierre) una barra de herramientas determinada?

StackOverflow https://stackoverflow.com/questions/347274

Pregunta

He escrito una barra de herramientas que se ejecuta en la barra de tareas. Desafortunadamente, después de que se instala, el usuario tiene que habilitarlo manualmente. ¿Hay alguna manera de decirle al explorador que abra (o cierre) una barra de herramientas determinada?

Me gustaría que el instalador, NSIS, active la barra de herramientas cuando se complete la instalación (me doy cuenta de que sería necesario un complemento).

También quiero saber si es posible habilitar automáticamente una barra de herramientas para todos los usuarios, por ejemplo, en un entorno corporativo donde múltiples usuarios compartirían una PC.

¿Fue útil?

Solución

  • Este comentario de CodeProject lo hace simulando presionar teclas
  • Vista + tiene API para hacer esto, con ShowDeskBand y HideDeskBand
  • Editar: Este código ahora puede Agregar un objeto de banda de escritorio (de Pinvoke.net, y estos dos preguntas del foro de MSDN):

    [ComImport]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("4CF504B0-DE96-11D0-8B3F-00A0C911E8E5")]
    public interface IBandSite
    {
        [PreserveSig]
        uint AddBand([In, MarshalAs(UnmanagedType.IUnknown)] Object pUnkSite);
        [PreserveSig]
        void RemoveBand(uint dwBandID);
    }
    
    
    private uint AddDeskbandToTray(Guid Deskband)
    {
        Guid IUnknown = new Guid("{00000000-0000-0000-C000-000000000046}");
        Guid ITrayBand = new Guid("{F60AD0A0-E5E1-45cb-B51A-E15B9F8B2934}");   
        Type TrayBandSiteService = Type.GetTypeFromCLSID(ITrayBand, true);
        IBandSite BandSite = Activator.CreateInstance(TrayBandSiteService) as IBandSite;
        object DeskbandObject = CoCreateInstance(Deskband, null, CLSCTX.CLSCTX_INPROC_SERVER, IUnknown);
        return BandSite.AddBand(DeskbandObject);
    }
    

Y, un ejemplo de uso:

Guid address_toolbar_guid = new Guid("{01E04581-4EEE-11D0-BFE9-00AA005B4383}");
uint band_id = AddDeskbandToTray(address_toolbar_guid);

Tendría sentido que una llamada similar a RemoveBand también sirviera, pero hasta el momento, no puedo hacer que ese código funcione. Otro problema: la banda de escritorio agregada se cierra cuando se cierra la aplicación que la agregó.

Otros consejos

Es posible que desee consulte este artículo . Parece que solo puede hacer esto ("oficialmente" de todos modos) en Vista usando Interfaz ITrayDeskBand .

No puedo encontrar la URL exacta en este momento, pero recuerdo que hubo una discusión sobre esto en torno a PDC2008, donde básicamente esto no estaba habilitado específicamente para que los programas aleatorios no pudieran llenar la barra de tareas sin el consentimiento de los usuarios.

Un efecto secundario de esto es que muy pocos usuarios incluso habilitan la barra de escritorio WMP de forma predeterminada.

Por lo que entiendo, las ubicaciones y valores de las barras de tareas, etc., se almacenan en el registro (olvidé la ubicación exacta), por lo que si encuentra la clave de registro específica, puede tomar su ubicación y hacer que su instalador inserte la clave de registro en la computadora para que la barra de tareas está habilitado.

No es realmente una respuesta a su pregunta, pero por favor, por favor: no escriba extensiones de shell (¡y una barra de tareas es una extensión de shell) en .NET!

He aquí por qué .

Básicamente, estás rompiendo otras aplicaciones.

si verifica bien, google toolband existe mientras se ejecuta un exe (GoogleDesktop.exe), por lo que si insiste en la forma en que se crean instancias de google o de la barra de búsqueda, debe verificar nuevamente TrayBandSiteService y hacer un exe de soporte ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top