Повідомлення цикл

Прості повідомлення цикл, що складається з одну функцію call кожного з цих трьох функцій: GetMessage, TranslateMessageі DispatchMessage.

MSG msg;

під час (GetMessage (amp; 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 не робить нічого з повідомлення.

Основний потік додатків починається його повідомлення цикл після ініціалізації застосунку та створення принаймні одного вікна. Як тільки почалося, повідомлення цикл триває для отримання повідомлень з черга повідомлень в темі і їх перекидання для відповідних windows. Цикл повідомлення закінчується, коли GetMessage функція видаляє WM_QUIT повідомлення з черги повідомлень.

Тільки одне повідомлення петлю необхідні для черга повідомлень, навіть якщо застосунок містить багато windows. DispatchMessage завжди розсилок повідомлення до належного вікна; Це тому, що кожне повідомлення в черги MSG структури, що містить дескриптор вікна, до якої належить повідомлення.

Ви можете змінити повідомлення циклу в різних напрямках. Наприклад, можна отримати повідомлення з черги, без призначення їх до вікна. Це зручно для додатків, які відправляти повідомлення, не вказуючи вікно. Ви також можете прямий GetMessage для пошуку певних повідомлень, залишивши інші повідомлення в черзі. Це корисно, якщо ви тимчасово повинні обходити звичайний порядок FIFO черга повідомлень.

Застосунок, який використовує клавіші виклику, повинні мати можливість перевести клавіатури повідомлень на команду повідомлення. Для цього циклу програми повідомлення має містити виклику функції TranslateAccelerator . Щоб отримати додаткові відомості про клавіші виклику побачити Клавіатури натисканням.

Якщо потік використовує діалогове вікно немодальною, петлі повідомлення повинна включати функцію IsDialogMessage , так що діалогового вікна можна отримувати введення клавіатури.

Index