#define let void
#define with std::function

// ─── Выбор сообщений ───

let ReadMessages (HAB Thread, with <void (PQMSG)> DispatchMessage)
{
  // Читаем сообщения из очереди.
  QMSG Message = {0}; ULONG Rc = 1;

  while (Rc)
  {
    // Забираем сообщение.
    Rc = WinGetMsg (Thread, &Message, 0, 0, 0);

    // Если выбор не должен быть завершён:
    if (Rc)
    {
      // Проверяем, не идёт ли вслед за выбранным сообщением ещё одно такое же сообщение.
      BYTE Same_message = 0; QMSG Next_message = {0}; 

      WinPeekMsg (Thread, &Next_message, NULLHANDLE, Message.msg, Message.msg, PM_NOREMOVE);

      if (Next_message.msg  == Message.msg &&
          Next_message.mp1  == Message.mp1 &&
          Next_message.mp2  == Message.mp2 &&
          Next_message.hwnd == Message.hwnd) Same_message = 1;

      // Выполняем действие или продолжаем выбор сообщений.
      if (!Same_message)
      {
        DispatchMessage (&Message);
      }
      else
      {
        ;
      }
    }
    else
    {
      break;
    }
  }
}