לולאת הודעה

לולאת הודעה פשוטה מורכבת קריאה לפונקציה אחת לכל אלה שלוש פונקציות: GetMessage, TranslateMessage, DispatchMessage.

MSG msg;

בזמן (GetMessage (כח; msg, NULL, 0, 0))
{
    TranslateMessage (& msg);
    DispatchMessage (& msg);
} 

הפונקציה GetMessage מאחזר הודעה מהתור, מעתיק אותו למבנה מסוג MSG. היא מחזירה ערך שאינו אפס, אלא אם הוא נתקל ההודעה WM_QUIT , בבמקרה זה מחזירה FALSE כזה ומסתיים הלולאה. ביישום הליכי משנה, סיום הלולאה ההודעה היא לעיתים קרובות בשלב הראשון לסגור את היישום. יישום לסיים לולאה משלו על-ידי שימוש בפונקציה PostQuitMessage , בדרך כלל בתגובה להודעת WM_DESTROY בשגרת חלון של החלון הראשי של היישום.

אם תציין מטפל בחלון הפרמטר השני של GetMessage, רק הודעות עבור החלון שצוין שאוחזרו מהתור. GetMessage גם לסנן הודעות בתור, אחזור הודעות המתרחשות בטווח שצוין בלבד. לקבלת מידע נוסף אודות סינון הודעות, ראה סינון הודעות.

לולאת הודעה של הליך משנה חייב לכלול TranslateMessage אם הליך המשנה כדי לקבל תו קלט מלוח המקשים. המערכת יוצרת הודעות מקש וירטואלי (WM_KEYDOWN ו- WM_KEYUP) בכל פעם שהמשתמש מקיש על מקש. הודעה מקש וירטואלי מכיל קוד מקש וירטואלי המזהה איזה מקש היה לחוץ, אך לא את הערך תו. כדי לאחזר ערך זה, לולאת הודעה חייב להכיל TranslateMessage, אשר מתרגם את ההודעה מקש וירטואלי הודעה תו (WM_CHAR) וממקם אותו בחזרה אל התור של היישום. ההודעה תו יכול להיות על איטראציה עוקבות של הלולאה הודעה ואז לשלוח שגרה חלון.

הפונקציה DispatchMessage שולח הודעה ההליך חלון המשויכים מטפל בחלון שצוין במבנה MSG . אם מטפל בחלון HWND_TOPMOST, DispatchMessage שליחת ההודעה להליכים חלון של כל חלונות ברמה העליונה במערכת. אם נקודת האחיזה של החלון הוא NULL, DispatchMessage עושה כלום עם ההודעה.

Thread הראשי של יישום מופעלת שלה לולאת הודעה לאחר אתחול היישום ויצירת חלון אחד לפחות. לאחר הפעלת הכלי, לולאת הודעה ממשיך כדי לאחזר את הודעות מתור ההודעות של הליך המשנה שיגור אותם ל- windows המתאים. לולאת הודעה מסתיים כאשר הפונקציה GetMessage מסירה את ההודעה WM_QUIT מתור ההודעות.

לולאת הודעה אחת בלבד דרוש עבור תור הודעות, גם אם יישום מכיל חלונות רבים. DispatchMessage ומשגר תמיד את ההודעה בחלון המתאים; פעולה זו הוא כי כל הודעה בתור מבנה MSG המכיל את נקודת האחיזה של חלון שאליו שייך ההודעה.

באפשרותך לשנות לולאת הודעה במגוון דרכים. לדוגמה, באפשרותך לאחזר הודעות מתור ללא בשיגור אותן לחלון. דבר זה שימושי עבור יישומים להציב הודעות לא ציון חלון. באפשרותך גם ישירה GetMessage כדי לחפש הודעות ספציפיות, השארת הודעות אחרות בתור. אפשרות זו שימושית אם עליך לעקוף באופן זמני את סדר FIFO הרגילים של תור ההודעות.

יישום המשתמש מקשי האצה להיות מסוגל לתרגם את ההודעות מקשים להודעות הפקודה. כדי לעשות זאת, לולאת הודעה של היישום חייב לכלול קריאה לפונקציה TranslateAccelerator . לקבלת מידע נוסף אודות מקשי קיצור, ראה האצה.

אם הליך משנה משתמש של תיבת הדו-שיח modeless, לולאת הודעה עליך לכלול את הפונקציה IsDialogMessage כך תיבת הדו-שיח יוכלו לקבל קלט של לוח מקשים.

Index