سؤال

يبتلع AXACROPDF جميع الأحداث المتعلقة بالمفاتيح بمجرد أن يتم التركيز عليها ، بما في ذلك الاختصارات ، ومكابس المفاتيح ، وما إلى ذلك. أضفت مرشح الرسائل ، ولا تحصل على أي رسائل متعلقة بالمفاتيح أيضًا. إنه مكون com ، هل يمكن أن يكون ذلك مناسبًا؟

هل هناك أي طريقة للقبض عليها قبل أن تبدأ السيطرة في ابتلاعها؟

هل كانت مفيدة؟

المحلول

Hans صحيح ، يولد قارئ Acrobat عمليتين ACRORD32 طفل لا يمكنك الوصول إليه مباشرة من داخل الرمز المدارة.

لقد جربت هذا ولديك ثلاثة خيارات قابلة للحياة:

  1. يمكنك إنشاء ملف خطاف النظام العالمي, ، ثم ابحث عن رسائل WM_SETFOCUS وتصفيةها وتصفيةها إلى Windows ACRORD32. يمكنك إنجاز بعض هذا من داخل C# باستخدام مكتبة Wrapper ، مثل تلك هنا: http://www.codeproject.com/kb/system/wilsonsystemglobalhooks.aspx

    تحتاج أيضًا إلى تحديد العمليات الصحيحة حيث قد يكون هناك أكثر من مثيل واحد من التطبيق الخاص بك ، أو مثيلات أخرى من ACRORD32. هذا هو الحل الأكثر حتمية ، ولكن نظرًا لأن تطبيقك سيقوم الآن بتصفية الرسائل المرسلة إلى كل نافذة موجودة ، فأنا عمومًا لا أوصي بهذا النهج لأن البرنامج قد يؤثر سلبًا على استقرار النظام.

  2. العثور على البديل التحكم في مشاهدة PDF. شاهد هذه الإجابة لبعض المكونات التجارية: .NET PDF Control Control أو لفة خاصة بك: http://www.codeproject.com/kb/applications/PDFViewerControl.aspx

  3. العثور على اختراق مقبول. اعتمادًا على مدى قوة تطبيقك ، قد يكون رمز مثل ما يلي مناسبًا (كان مناسبًا لحالتي):

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

نصائح أخرى

قد يكون لدي أخيرًا إجابة بسيطة يبعث على السخرية. حتى الآن في اختبار هذا يعمل.

بعد أن عانى من هذه المشكلة لبعض الوقت وقم ببناء نظام معقد لكل تسجيل تحكم مخصص أي منها آخر يركز عليه واستخدام مؤقت لوجه التركيز (عندما أمسك ACROPDF) ، قمت بإعادة النظر في هذه المشكلة وقراءة عدد كبير من إجابات (تبحث عن الحلول الحديثة). ساعدتني المعلومات التي تم الحصول عليها في هذه الفكرة.

تتمثل الفكرة في تعطيل عنصر التحكم (ACROPDF) أثناء التحميل كما في المثال التالي (تم تخفيض الكود للوضوح)

axacropdf_this.endabled = false axacropdf_this.src = m_src

ثم في مؤقت ، بعد قول ثانية واحدة.

axacropdf_this.enabled = false

في الأساس ، تتمثل الفكرة في إخبار Windows بعدم السماح للمستخدمين باستخدام عنصر تحكم ACROPDF حتى يسمح به ، لذا فإن مطالبة Windows بمنعه من التركيز (لأنه لا يُسمح للمستخدمين بالدخول إلى هناك).

حتى الآن هذا الأمر ، سأقوم بتحرير هذا إذا تغير أي شيء. إذا لم ينجح الأمر تمامًا ، فربما تشير الفكرة إلى اتجاه مفيد.

إنه عنصر كوم خارج العملية ، هذه هي المشكلة. تمامًا في انتهاك لمتطلبات Windows SDK كما هو موضح في setParent (). بمجرد أن يتم التركيز على نافذتها ، تحصل حلقة الرسائل في عملية acroread.exe على جميع الرسائل ، لا يمكن لمرشح الرسائل رؤية أي رسائل بعد الآن.

من الناحية الفنية ، يمكن تثبيته باستخدام SetWindowShookex () لحقن DLL في العملية ومراقبة الرسائل باستخدام WH_GETMessage. لكن لا يمكنك كتابة مثل هذا DLL بلغة C#.

تمتص الرائد ، وأنا أعلم. لا يبدو أن هناك أي نقص في هذا البرنامج.

لسبب ما إجابة تيم ، تعطيل عنصر تحكم AxacropDF مباشرة ، لم يعمل في حالتي. إن حدث الإجازة على مربع النص الذي تم اختياره مسبقًا لن يطلق النار أيضًا.

ما هو العمل هو تعشيش عنصر تحكم AxacropDF داخل مجموعة Groupbox المعوقة. نظرًا لأن مستخدمي التطبيق الخاص بي يحتاجون إلى رؤية PDF فقط ، وليس التفاعل معه ، يتم تعيين خاصية Groupbox الممكّنة على False في المصمم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top