سؤال

أنا أستخدم غلاف COM للتفاعل مع Windows Media Player.

إنه يستخدم AxHost لتغليف اللاعب بطريقة ما، بالنسبة لي، الأمر كله مجرد سحر تحت الغطاء ^^

تبدو واجهة AxHost.AttachInterfaces بهذا الشكل

    protected override void AttachInterfaces() 
    {
        try 
        {   
            //Get the IOleObject for Windows Media Player.
            IOleObject oleObject = this.GetOcx() as IOleObject;

            //Set the Client Site for the WMP control.
            oleObject.SetClientSite(this as IOleClientSite);

            Player = this.GetOcx() as WMPLib.WindowsMediaPlayer; 
...

كل شيء يعمل بشكل جيد طالما أنني أستضيف AxHost في عنصر تحكم Windows Forms.لكن لا يمكنني ربط الأحداث في المُنشئ.

هذا على سبيل المثال لا يعمل:

    public WMPMediaRating()
    {
        var remote = new WMPRemote.RemotedWindowsMediaPlayer();
        _WMP = remote.Player;

        _WMP.MediaChange += new _WMPOCXEvents_MediaChangeEventHandler(_WMP_MediaChange);
    }

يكون Remote.Player دائمًا خاليًا ويتعطل البرنامج باستخدام NullReferencesException.

يتم تنفيذ التعليمات البرمجية الموجودة في AttachInterfaces() بطريقة ما فقط بعد رسم النموذج، أو بعد الانتهاء من كل شيء آخر.

لقد حاولت استدعاء AttachInterfaces() يدويًا، لكن ذلك لم ينجح أيضًا لأن GetOcx() لا يُرجع شيئًا.


إذًا كيف يمكنني إنشاء عنصر التحكم الموروث من AxHost بدون Windows Forms، لاستخدامه على سبيل المثال في تطبيق وحدة التحكم؟

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

المحلول

لعِلمِكَ:لا أحد يمنعك من استخدام نافذة مخفية في تطبيق وحدة التحكم الخاصة بك.

لن تتمكن من استضافة مشغل الوسائط في تطبيق غير نظام التشغيل Windows - فهو يتطلب الاستضافة.إذا كنت تريد تشغيل بعض الموسيقى، فيمكنك استخدام Media Graphs لإنشاء رسم بياني يعرض (يشغل) ملف الموسيقى الخاص بك - ولن يتطلب ذلك أي استضافة إضافية.

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