كيف Win32 الحدث يحركها البرمجة تنفذ تحت غطاء محرك السيارة ؟

StackOverflow https://stackoverflow.com/questions/765421

سؤال

في C++ Win32 التطبيق ، نبدأ حلقة رسالة جلب الرسائل من قائمة انتظار يترجم بها ومن ثم ترسل لهم.في نهاية المطاف, كل رسالة تصل لدينا WndProc حيث يرتبط هذا الحدث يمكن التعامل معها.

أنا أفهم هذا الجزء.ما لا أفهمه هو في بين ما كان يجري.على وجه التحديد:

  1. أنواع مختلفة من نظام التشغيل معالجات المقاطعة يجب أن يكون وضع الرسائل في رسالة طابور', ولكن أين في مساحة عنوان العملية هل هذا الانتظار اإلقامة ؟ كيف يتعرض إلى معالج المقاطعة الرمز ؟
  2. ما يعني أن "ترجمة" الرسالة ؟ ما معنى الدعوة إلى TranslateMessage() حقا ؟
  3. مرة أرسلت من قبل DispatchMessage(), ما كل الأماكن لا رسالة البديل قبل الوصول إلى بلدي WndProc (أيماذا نظام التشغيل مع ذلك) ؟

إذا كان أي شخص يعرف الإجابات إلى ما سبق ، يرجى يرضي فضولي.شكرا

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

المحلول

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

يمكن أن تحتوي التطبيقات على قائمة انتظارهم لمعالجة الرسائل. يتم إنشاء تلك الانتظار تحت الطلب (فقط إذا لزم الأمر).

يتم استخدام رسالة يتم استخدام رسالة لإنشاء رسائل ليست أحداث "حقيقية". على سبيل المثال، تتم "ترجمة رسالة WM_CONTEXTMENU" من النقر بزر الماوس الأيمن فوق الماوس، أو مفتاح قائمة السياق، أو SHIFT-F10. يتم ترجمة WM_CHAR من رسائل WM_KEYDown. وبالطبع العديد من الرسائل الأخرى "ترجمت" بهذه الطريقة.

يتم نشر رسالة إلى كل نافذة يجب أن تتلقىها. يقرر نظام التشغيل اعتمادا على نوع الرسالة ما إذا كان يجب أن تتلقى نافذة هذه الرسالة أم لا. تنتظر معظم الرسائل بواسطة النظام، أي لن يتم إرسال الرسالة إلى نافذة أخرى حتى تتم معالجتها بواسطة النافذة. هذا له تأثير كبير على رسائل البث: إذا لم تعد نافذة واحدة عند التعامل مع هذه الرسالة، فإن قائمة الانتظار هي منعت ويندوز أخرى لن تتلقى الرسالة بعد الآن.

نصائح أخرى

ذلك يعتمد على كيفية إرسال رسالتك وكيف يتم التعامل معها.

عند استدعاء SendMessage، إذا كانت النافذة المستهدفة مملوكة من خلال الخيط الحالي، فإن المكالمة توازن قائمة انتظار الرسائل للنافذة ومكالمك إدارة النافذة مباشرة WindowProC في النافذة المستهدفة. إذا كانت النافذة المستهدفة مملوكة من قبل مؤشر ترابط آخر، فإن إدارة النافذة تستدعي رسائل نافذة PostMessage ومضخاتها بفعالية حتى تعود النافذة المستهدفة من النافذة Proc.

عند استدعاء PostMessage، يقوم Manager Manager بتنظيم معلمات الرسائل وإدراج الكائن المقابل على قائمة انتظار الرسائل للإطار الهدف. عندما يستدعي GetMessage، تتم إزالة الرسالة من قائمة انتظار الرسائل.

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

كما أشار ستيفان، يترجم TranslatAtemessage فقط مفاتيح التسارع - على سبيل المثال، يقوم بتحويل التسلسلات الرئيسية إلى رسائل WM_COMMAND.

أنواع مختلفة من نظام التشغيل معالجات المقاطعة يجب أن يكون وضع الرسائل في رسالة طابور', ولكن أين في مساحة عنوان العملية هل هذا الانتظار اإلقامة ؟ كيف يتعرض إلى معالج المقاطعة الرمز ؟

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

الرسائل التي يتم نشرها توضع مباشرة في انتظار موضوع عن الهدف النافذة.

الرسائل التي يتم إرسالها عادة معالجتها مباشرة (تجاوز طابور).

تفاصيل الحصول على شعر.على سبيل المثال موضوع طوابير أكثر من قوائم الرسائل-كما أنها تحافظ على بعض المعلومات.بعض الرسائل (مثل WM_PAINT) ليسوا في قائمة الانتظار ، ولكن تصنيعه من إضافية معلومات الدولة عند الاستعلام في قائمة الانتظار فارغة.الرسائل المرسلة إلى نظام التشغيل windows يملكها غيرها من المواضيع التي يتم نشرها في الواقع إلى المتلقي الانتظار بدلا من معالجتها مباشرة ، ولكن النظام يجعل الأمر يبدو وكأنه العادية حجب ترسل من المتصل من وجهة نظر.مرح تستتبعه إذا كان هذا يمكن أن يسبب الجمود (لأن التعميم يرسل العودة إلى الموضوع الأصلي).

جيفري ريختر الكتب الكثير ( ؟ ) من التفاصيل.بلدي الطبعة القديمة (Windows المتقدمة).الطبعة الحالية يبدو أن يسمى ويندوز عن طريق C/C++.

نظام التشغيل يفعل الكثير من العمل لجعل الرسالة تيار تظهر الرشيد (و بسيطة نسبيا) إلى المتصل.

ما يعني أن "ترجمة" الرسالة ؟ ما معنى الدعوة إلى TranslateMessage() حقا ؟

فإنه الساعات الافتراضية الرسائل الرئيسية ، عندما تعترف الرئيسية-أسفل/مفتاح الجمع ، فإنه يضيف حرف الرسائل.إذا كنت لا الاتصال TranslateMessage, لن تتلقى رسائل شخصية مثل WM_CHAR.

وأظن أنه يرسل رسالة شخصية مباشرة قبل العودة (بدلا من نشرها).لم يتم التحقق ، ولكن أذكر أن WM_CHAR وصول رسائل فقط قبل WM_KEYUP.

مرة أرسلت من قبل DispatchMessage () ما كل الأماكن لا رسالة البديل قبل الوصول إلى بلدي WndProc (أيماذا نظام التشغيل مع ذلك) ؟

DispatchMessage يمر الرسالة إلى WndProc الهدف النافذة.على طول الطريق ، بعض السنانير قد تحصل على فرصة لرؤية الرسالة (وربما يتعارض مع ذلك).

لمعالجة آخر Subquestion، ستذهب رسالة مرسلة إلى WindowProc بعد أن تم نقلها عبر جميع السنانير (WH_CALLWNDPROC)

ليس إيجابيا تماما حول هذا ولكن أفضل تخمين يقول:

  1. قائمة الانتظار هي كائن نظام يمكنك الوصول إليه باستخدام مكالمات API Win32. ليس في مساحة عنوان العملية الخاصة بك على الإطلاق. لذلك يمكن للمعالجين المقاطعة الوصول إليها (ربما من خلال HAL (طبقة تجريد الأجهزة) من النواة).

  2. في Win16، استغرقت هذه الدعوة الفرعية الفرعية المختلفة لرسالة أكبر ومهرودها بالكامل. لذلك من شأنه أن يضيف TranslatAteMessage WM_KEYPREPS عند العثور على تسلسل WM_KEYDOWD المطابق WM_KEYDATE. ستحول أيضا إلى العديد من الرسائل إلى رسائل DoubleClick بناء على الإعداد الداخلي وتشغيل الطوابع الزمنية للرسائل. ما إذا كان لا يزال يفعل ذلك في Win32، لا أعرف.

  3. من المحتمل أن تتم معالجة السنانير رسالة نافذة. لذلك إذا كان هناك خطاف في نافذتك، فستدعى هنا أو عند استدعاء GetMessage. لست واثق. بخلاف ذلك، فإن Dispatchmessage يبحث عن عنوان WNDProC المرتبط بالنافذة واتصل به. ليس هناك الكثير لتفعله.

امل ان يساعد.

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