Question

Le AxAcroPDF engloutit tous les événements liés à la clé dès qu'il obtient le focus, y compris les raccourcis, touches, etc. J'ai ajouté un filtre de message, et il ne reçoit pas de messages relatifs à clés non plus. Il est un composant COM, pourrait-il être utile?

Est-il possible d'attraper ceux-ci avant que le contrôle commence à les avaler?

Était-ce utile?

La solution

Hans est correct, Acrobat Reader engende deux enfants processus Acrord32 que vous avez pas d'accès direct à partir de votre code managé.

Je l'ai expérimenté avec cela et vous avez trois options viables:

  1. Vous pouvez créer un hook global du système , puis chercher et filtrer / répondre aux messages WM_SETFOCUS envoyés à vos enfants fenêtres Acrord32. Vous pouvez accomplir une partie de ce à partir de C # en utilisant une bibliothèque d'emballage, comme celui ici: http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx

    Vous devez également identifier les processus corrects car il peut y avoir plus d'une instance de votre application, ou d'autres instances de Acrord32. Ceci est la solution la plus déterministe, mais parce que votre application sera maintenant le filtrage des messages envoyés à chaque fenêtre unique dans l'existence, je ne recommande pas généralement cette approche car alors votre programme pourrait avoir une incidence négative sur la stabilité du système.

  2. Rechercher Contrôle de visualisation PDF alternatif . Voir cette réponse pour quelques composants commerciaux: .net PDF de contrôle Viewer, ou rouler votre propre: http://www.codeproject.com/KB/applications/PDFViewerControl.aspx

  3. Rechercher bidouille acceptable . En fonction de la robustesse de votre application doit être, le code tel que le suivant peut convenir (il a été adapté pour mon cas):

    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();
    }
    

Autres conseils

Je pourrais enfin avoir une réponse ridiculement simple. Jusqu'à présent, pour tester ce qui fonctionne.

Après avoir souffert de ce problème depuis un certain temps et après avoir construit un système complexe de chaque enregistrement de contrôle personnalisé qui leur avait dernière mise au point et à l'aide d'une minuterie pour revenir de mise au point chiquenaude (quand AcroPDF a saisi) Je revisité ce problème et lu grand nombre de réponses (recherche de solutions récentes). Les informations glanées me a aidé à l'idée.

L'idée est de désactiver le (AcroPDF) contrôle alors qu'il est en cours de chargement comme dans l'exemple suivant (code réduit par souci de clarté)

AxAcroPDF_this.Enabled = False AxAcroPDF_this.src = m_src

Puis sur une minuterie, après par exemple 1 seconde.

AxAcroPDF_this.Enabled = False

En fait l'idée est de dire à Windows de ne pas laisser les utilisateurs utilisent le contrôle AcroPDF jusqu'à ce permis, afin de demander Windows pour l'empêcher de se focus (parce que les utilisateurs ne sont pas autorisés là-bas).

Jusqu'à présent, cela se tient, j'éditera ce si quelque chose change. Si cela ne fonctionne pas tout à fait pour vous, alors peut-être les points d'idée dans une direction utile.

Il est un composant COM hors processus, qui est le problème. Complètement en violation des exigences de Windows SDK comme prévu dans SetParent (). Une fois que la fenêtre obtient le focus, la boucle de message dans le processus de acroread.exe reçoit tous les messages, votre filtre de messages ne peuvent pas voir les messages plus.

Techniquement, il peut être fixé à l'aide de SetWindowsHookEx () pour injecter une DLL dans les messages de processus et de surveiller avec WH_GETMESSAGE. Mais vous ne pouvez pas écrire une DLL dans le langage C #.

Major sucent, je sais. Il ne semble jamais être un manque de avec ce programme.

Pour une raison quelconque la réponse de Tim, la désactivation du contrôle de AxAcroPDF directement, ne travaillaient pas dans mon cas. L'événement sur le congé ne serait jamais Textbox précédemment sélectionné le feu, que ce soit.

Qu'est-ce qui fonctionne est l'imbrication du contrôle de AxAcroPDF à l'intérieur d'un GroupBox désactivé. Étant donné que les utilisateurs de mon besoin d'application à ne voir le PDF, pas interagi avec elle, la propriété GroupBox Activé est définie sur False dans le concepteur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top