Pregunta

El AxAcroPDF se traga todos los eventos relacionados con la llave tan pronto como se pone el foco, incluidos los accesos directos, pulsaciones de teclas, etc. he añadido un filtro de mensajes, y que no recibe los mensajes relativos a la clave tampoco. Es un componente COM, que podría ser relevante?

¿Hay alguna manera de atrapar a estos antes de que comience el control de tragarlas?

¿Fue útil?

Solución

Hans es correcta, el programa Acrobat Reader de desoves dos niños Acrord32 procesos que no tienen acceso directo a partir de dentro de su código administrado.

He experimentado con esto y usted tiene tres opciones viables:

  1. Se puede crear un enlace global del sistema , y luego buscar y filtrar / responder a los mensajes enviados a WM_SETFOCUS sus ventanas secundarias Acrord32. Esto se puede hacer algo de esto desde el interior de C # mediante el uso de una biblioteca envoltorio, como el que aquí: http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx

    También es necesario identificar los procesos correctos ya que puede haber más de una instancia de la aplicación, u otros casos de Acrord32. Esta es la solución más determinista, pero debido a que su aplicación ahora será filtrando los mensajes enviados a cada ventana en la existencia, por lo general, no recomiendo este enfoque, ya continuación, el programa podría afectar negativamente a la estabilidad del sistema.

  2. Encontrar un alternativo de control de visualización de PDF . Ver esta respuesta durante unos componentes comerciales: .net PDF Visor de control , o hágalo usted mismo: http://www.codeproject.com/KB/applications/PDFViewerControl.aspx

  3. Encontrar un truco aceptable . En función de la solidez de su aplicación tiene que ser, código como el siguiente puede ser adecuado (que era adecuado para mi caso):

    DateTime _lastRenav = DateTime.MinValue;
    
    public Form1()
    {
        InitializeComponent();
    
        listBox1.LostFocus += new EventHandler(listBox1_LostFocus);
    }
    
    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        axAcroPDF1.src = "sample.pdf";  //this will cause adobe to take away the focus
        _lastRenav = DateTime.Now;
    }
    
    void listBox1_LostFocus(object sender, EventArgs e)
    {
        //restores focus if it were the result of a listbox navigation
        if ((DateTime.Now - _lastRenav).TotalSeconds < 1)
            listBox1.Focus();
    }
    

Otros consejos

Por fin podría tener una respuesta ridículamente simple. Hasta ahora, en las pruebas de este está trabajando.

Después de haber sufrido de este problema desde hace bastante tiempo y haber construido un complejo sistema de cada grabación control personalizado cuál de ellos pasado tuvo el enfoque y el uso de un temporizador para el enfoque trasero flip (cuando AcroPDF agarró) volví a visitar este problema y leer un gran número de respuestas (en busca de soluciones recientes). La información obtenida me ayudó con la idea.

La idea es desactivar el control (AcroPDF) mientras que es de carga como en el ejemplo siguiente (código reducida para mayor claridad)

AxAcroPDF_this.Enabled = False AxAcroPDF_this.src = m_src

A continuación, en un temporizador, por ejemplo después de 1 segundo.

AxAcroPDF_this.Enabled = false

Básicamente la idea es decirle a Windows no dejar que los usuarios utilizan el control de AcroPDF hasta que le autorice, por lo que pide Windows para evitar que se haga de enfoque (ya que los usuarios no están permitidos en ese país).

En lo que va se mantiene, voy a editar este si algo cambia. Si esto no funciona completamente para usted, entonces tal vez los puntos idea en una dirección útil.

Es un componente COM fuera de proceso, que es el problema. Completamente en violación de los requisitos de Windows SDK como se establece en SetParent (). Una vez que la ventana obtiene el foco, el bucle de mensajes en el proceso acroread.exe se lleva todos los mensajes, el filtro de mensajes no pueden ver los mensajes más.

Técnicamente se puede fijar mediante el uso de SetWindowsHookEx () para inyectar una DLL en los mensajes de proceso y monitor con WH_GETMESSAGE. Pero no se puede escribir un archivo DLL como en el lenguaje C #.

Mayor chupar, lo sé. Nunca parece haber ninguna falta de ella con ese programa.

En respuesta alguna razón de Tim, deshabilitar el control AxAcroPDF directamente, no funcionó en mi caso. Dejar el evento en el cuadro de texto seleccionado anteriormente nunca se haría fuego, tampoco.

¿Qué está funcionando anida el control AxAcroPDF en el interior de un GroupBox discapacitados. Dado que los usuarios de mi necesidad de aplicación a sólo ven el PDF, no interactúa con él, propiedad Enabled del GroupBox se establece en False en el diseñador.

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