Domanda

L'AxAcroPDF inghiotte tutti gli eventi chiave-correlata, non appena si arriva messa a fuoco, tra cui i collegamenti, pressioni di tasti ecc Ho aggiunto un filtro dei messaggi, e non ottiene alcun messaggio chiave relative sia. Si tratta di un componente COM, che potrebbe essere rilevante?

C'è un modo per catturare questi prima dell'inizio del controllo ingerirli?

È stato utile?

Soluzione

Hans è corretta, l'Acrobat Reader genera due bambini processi Acrord32 cui si ha accesso diretto al dall'interno del codice gestito.

Ho sperimentato con questo e si hanno tre opzioni praticabili:

  1. È possibile creare un gancio sistema globale , e quindi cercare e filtrare / rispondere ai messaggi inviati WM_SETFOCUS al vostro bambino Acrord32 finestre. È possibile eseguire alcune di queste da dentro C # utilizzando una libreria wrapper, come quello qui: rel http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx

    È inoltre necessario identificare i processi corretti in quanto vi possono essere più di un'istanza dell'applicazione, o di altri casi di Acrord32. Questa è la soluzione più deterministica, ma perché la vostra applicazione sarà ora filtrando i messaggi inviati ad ogni singola finestra esistente, io in genere non consiglio questo approccio perché allora il tuo programma potrebbe influenzare negativamente la stabilità del sistema.

  2. Trova un si alternano la visualizzazione di PDF di controllo . Vedere questa risposta per un paio di componenti commerciali: .net PDF Viewer controllo , o rotolare il proprio: http://www.codeproject.com/KB/applications/PDFViewerControl.aspx

  3. Trova un mod accettabile . A seconda di come robusto l'applicazione deve essere, il codice come il seguente può essere adatto (era adatto per il mio 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();
    }
    

Altri suggerimenti

I potrebbe finalmente avere una risposta ridicolmente semplice. Finora nel testare questo sta lavorando.

Dopo aver sofferto di questo problema per un bel po 'di tempo e di aver costruito un complesso sistema di ogni registrazione controllo personalizzato chi di loro lo scorso aveva messa a fuoco e l'utilizzo di un timer per fuoco posteriore Flip (quando AcroPDF afferrò) ho rivisitato questo problema e letto un gran numero di risposte (alla ricerca di soluzioni più recenti). Le informazioni raccolte mi ha aiutato con l'idea.

L'idea è quella di disabilitare il controllo (AcroPDF) mentre è carico come il seguente esempio (codice ridotte per chiarezza)

AxAcroPDF_this.Enabled = False AxAcroPDF_this.src = m_src

Poi su un timer, dopo diciamo 1 secondo.

AxAcroPDF_this.Enabled = False

In sostanza l'idea è quella di dire di Windows non lasciare che gli utenti utilizzano il controllo AcroPDF fino consentito, in modo chiedendo di Windows per evitare che si messa a fuoco (perché gli utenti non sono ammessi in là).

Finora questo è in possesso, mi permetterà di modificare questo se qualcosa cambia. Se non funziona del tutto per voi allora forse i punti idea in una direzione utile.

Si tratta di un componente COM out-of-process, che è il problema. Completamente in violazione dei requisiti di Windows SDK come stabilito nella SetParent (). Una volta che la sua finestra ottiene la messa a fuoco, il ciclo di messaggi nel processo acroread.exe ottiene tutti i messaggi, il vostro filtro dei messaggi non possono vedere più alcun messaggio.

Tecnicamente è risolvibile mediante SetWindowsHookEx () per iniettare una DLL nei messaggi di processo e del monitor con WH_GETMESSAGE. Ma non si può scrivere una DLL nel linguaggio C #.

Maggiore succhiare, lo so. Non c'è mai sembra essere una mancanza di esso con quel programma.

Per qualche ragione la risposta di Tim, disabilitando direttamente il controllo AxAcroPDF, non ha funzionato nel mio caso. L'evento Leave sulla casella di testo precedentemente selezionato non avrebbe mai il fuoco, sia.

Quello che sta lavorando è il controllo di nidificazione AxAcroPDF interno di un disabile GroupBox. Dal momento che gli utenti del mio bisogno applicazione per visualizzare solo il file PDF, non interagisce con esso, proprietà Enabled del GroupBox è impostata su False nella finestra di progettazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top