2011-02-15 27 views
8

Sé que es posible ampliar el menú contextual del archivo estándar. ¿Hay alguna forma de agregar elementos al menú contextual del cuadro de texto del sistema?Agregar elemento de menú contextual a todos los cuadros de texto del sistema operativo

Esto sería así, ¿el nuevo elemento aparece en cada cuadro de texto que un usuario puede escribir en cualquier lugar de Windows?

Por ejemplo, para permitir agregar características como buscar el texto seleccionado en un corrector ortográfico.

+1

en todo el sistema como en "sistema operativo" de ancho? –

+0

¡Sip! Eso es correcto – John

+2

Parece que estás a punto de crear algo extremadamente molesto. –

Respuesta

2

Hereda del cuadro de texto que intentas usar y agrega allí el valor predeterminado. Usa tu clase en lugar de la clase de cuadro de texto.

+0

Esto solo afectará a la aplicación actual – John

0

Llame al método Bind con el menú contextual y de formulario.

void Bind(Control c, ContextMenu menu) 
    { 
    foreach (Control subcontrol in c.Controls) 
     Bind(subcontrol); 

    TextBox textBox = c as TextBox; 
    if (textBox != null) 
    { 
     textBox.ContextMenu = menu; 
    } 
    } 

Si la adición de un cuadro de texto dinámico, a continuación, colocar esto en el beggining del método de enlace:

  c.ControlAdded += (s, e) => Bind(e.Control, menu); 

Esto hace que el método de enlace de llamada, siempre que se añade un control de la forma o de otra controlar.

1

que tendría que add a Mouse Hook

Y entonces aparecerá un menú contextual cuando la ventana/de control que hace clic es un cuadro de texto.

Esto podría interferir (y probablemente lo hará) con los menús contextuales ya presentes porque los ocultará o chocará con ellos.

(A horrible plan aunque ...)

3

Esto es técnicamente imposible con C#. Imaginemos la próxima situación. Supongamos que ha escrito con éxito su extensión administrada y "amplía" cualquier menú contextual de cuadro de texto en el sistema. Y, por supuesto, debe manejar cada nuevo elemento de menú que haya agregado. y para lograr esto, debe inyectar su código administrado a cada proceso que tenga cuadro de texto y reemplazar su WindProc. De acuerdo, supongamos que hay una aplicación administrada en el sistema que fue escrita para la versión .net diferente de la versión que usó para su extensión. Entonces, en este caso, obtendría un error crítico durante la inyección de la extensión, ya que SOLAMENTE se podría cargar una versión de .net por proceso. ASÍ QUE no hay forma de escribir una extensión robusta manejada de bajo nivel de gancho o shell. De here:

ganchos globales no son compatibles en el .NET Framework
A excepción de la WH_KEYBOARD_LL gancho de bajo nivel y la WH_MOUSE_LL gancho de bajo nivel, no pueden implementar enlaces globales en el Microsoft .NET Framework. Para instalar un gancho global , un gancho debe tener una exportación nativa DLL para inyectarse en otro proceso que requiera una función válida, consistente para llamar. Este comportamiento requiere una exportación DLL. El .NET Framework no es compatible con las exportaciones de DLL . El código administrado no tiene el concepto de un valor constante para un puntero de función porque estos punteros de función son proxies que se construyen dinámicamente.

Los procedimientos de gancho de bajo nivel se llaman en la rosca que instaló el gancho. Los ganchos de nivel bajo no requieren que el procedimiento de enlace se implemente en una DLL .

También puede consultar el artículo this y explorar por qué no debe escribir las extensiones de shell administradas.

+0

Muy interesante gracias – John

Cuestiones relacionadas