Как сделать окно активным

Обновлено: 18.05.2024

Проблема такова: необходимо сделать окно ПОСТОЯННО активным с фокусом ввода клавиатуры.
Решение, думаю, только с помощью API функций

Накопал теоретическое решение на дельфе (привожу в оригинале):

h:=FindWindow(nil,'Супер-пупер прога');
if h<>0 then begin
SetForeGroundWindow(h);
ShowWindow(h, SW_SHOW);
SetActiveWindow(h);
end;
Все круто, кроме одного: после этих телодвижений "Супер-пупер прога" больше не сворачивается кнопкой "Свернуть".

Как раз мне это и надо, но на VFP.
Подскажите полный код для VFP, плиз.

Вторая проблема: выставить игнорирование нажатия клавиш, с помощью которых окно становится неактивным (Alt+Tab, leftWin, rightWin).

У меня VFP9sp1, XPsp2
Загибаюсь

Проблема такова: необходимо сделать окно ПОСТОЯННО активным с фокусом ввода клавиатуры.
Накопал теоретическое решение на дельфе (привожу в оригинале):
h:=FindWindow(nil,'Супер-пупер прога');
if h<>0 then begin
SetForeGroundWindow(h);
ShowWindow(h, SW_SHOW);
SetActiveWindow(h);
end;

Честно признаюсь, что не очень-то понимаю, как SW_SHOW - Activates the window and displays it in its current size and position.) может тебе помочь, да и SW_SHOWMAXIMIZED - Activates the window and displays it as a maximized window. или SW_MAXIMIZE - Maximizes the specified window. вроде как "разовая акция".

В первом приближении можно попробовать и "соверщенно стандартными средствами". т.е. как-нить так:

Если твой вопрос из разряда: Как предотвратить запуск нескольких экземпляров VFP приложения на одном рабочем месте, имеющих один и тот же заголовок главного окна, то что-нибудь типа:

Исправлено: MichaelD, 03.08.06 02:50

Если версия до VFP6 включительно, то определение HWND окна примерно так

Для версий от VFP7 и старше это не требуется, поскольку и у основного окна FoxPro и у любой формы можно прочитать значение HWND напрямую.

Если прога на базе основного окна FoxPro

Если прога на базе As Top-Level формы, то

Ну, а далее уже работаешь с остальными функциями по найденному HWND

Может не прваидьно высказал проблему, но окно программы должно не только постоянно быть на экране (AlwaysOnTop = .T. проблему не решает - окно остается всегда на экране, но фокус клавиатуры пропадает ), окно должно быть АКТИВНЫМ с фокусом клавиатуры при попытках переключения окна, например по нажатию Alt+Tab, leftWin, rightWin. Чтобы умники не могли выйти из окна программы (человеческий фактор).

окно должно быть АКТИВНЫМ с фокусом клавиатуры при попытках переключения окна, например по нажатию Alt+Tab, leftWin, rightWin. Чтобы умники не могли выйти из окна программы


Сурово. Лучше тогда ДОС А вообще таймер пару раз в секунду с проверкой активного окна и принудительной активизацией требуемого, если активно не оно, что-то вроде GetActiveWindow|/SetActiveWindow

Ну, батенька и запросы Это вам не ДОС Это многозадачная система и интерфейс в ней блокировать нельзя
Думаю, что не терминал, а сканер.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.

Исправлено: Влад Колосов, 03.08.06 11:55

Именно терминал
Все думал как его обозвать
а задача и стоит в том чтоб уйти из под ДОСа
Пытаюсь сделать так:
свойство thisform.init:
declare integer ShowWindow in Win32API integer, integer
declare integer SetActiveWindow in Win32API integer
fHWND=thisform.HWND

thisform.timer1.interval=1000 &&(1 сек)

далее по таймеру:
timer1.timer:
ShowWindow(fHWND,sw_shownormal)

(Функция ShowWindow устанавливает состояние показа определяемого окна
SW_SHOWNORMAL - Активизирует и показывает окно. Если окно свернуто или развернуто, система восстанавливает его в первоначальном размере и позиции. Прикладная программа должна установить этот флажок при отображении окна впервые.)

При нажатии right/leftWIN окно становится неактивным и перекрывается ПУСКом, при повторном нажатии right/leftWIN возвращается в исходное состояние с фокусом. По Alt+Tab переключается на другую задачу, оставаясь на екране по AlwaysOnTop=.t.).

Данный код проблему не решает

Исправлено: m-viktor, 03.08.06 12:50

А если это терминал, то просто в настроцках подключения указывается конкретная запускаемая программа и юзер больше ничего не видит. Как обычно, задачу надо описывать, а свой вариант ее решения.

_screen.AlwaysOnTop =.t.
у скрина убирай все
рамку, хедер
распахивай при старте на весь экран

винды будет не видно
и никуда не кликнут

1. тогда каким образом в XP выставить невозможность запуска пользователем других програм
2. помоему проблема переключения задач не исчезнет (Alt+Tab)

> 1. тогда каким образом в XP выставить невозможность запуска пользователем других програм
через политики (policy)

коль через API вариантов рещения пока нет попробую через политики,
но хотелось бы найти решение не затрагивая настроек винды
чтоб не было дополнительной подстройки системы после установки приложения
настройка политики запуска и проч. не выход.

Исправлено: m-viktor, 03.08.06 15:04

я бы на месте админа подвешивал бы за выступающие части тела программеров, программы которых мешают нормальному функционированию операционки.

Может Вам просто отказаться от многозадачности?

В чем тогда смысл перехода на Win?
Плохую идею хорошим кодом не исправишь. Надо пользоваться вещами по их назначению и обучать пользователей тому же.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.

у него все правильно
бывают задачи когда .

посмотрите банкоматы
они все на винде, но Вы ее не увидете
есть еще оч. много чего
к примеру терминалы рентген контроля в аэропортах
там тоже приложение под нт4 работает и до винды юзеру не добраться


От переводчика: данная статья является девятой в цикле переводов официального руководства по библиотеке SFML. Прошлую статью можно найти тут. Данный цикл статей ставит своей целью предоставить людям, не знающим язык оригинала, возможность ознакомится с этой библиотекой. SFML — это простая и кроссплатформенная мультимедиа библиотека. SFML обеспечивает простой интерфейс для разработки игр и прочих мультимедийных приложений. Оригинальную статью можно найти тут. Посвящается Еве Вайт. С днем рождения;). Начнем.

1. Приступая к работе

  1. Рисование 2D объектов
  2. Спрайты и текстуры
  3. Текст и шрифты
  4. Формы
  5. Проектирование ваших собственных объектов с помощью массивов вершин
  6. Позиция, вращение, масштаб: преобразование объектов
  7. Добавление специальных эффектов с шейдерами
  8. Контроль 2D камеры и вида
  1. Проигрывание звуков и музыки
  2. Запись аудио
  3. Пользовательские потоки аудио
  4. Спатиализация: звуки в 3D

Вступление

Эта статья объясняет, как открыть и управлять окном. Рисование в окне выходит за пределы задач, решаемых модулем sfml-window ; эту задачу решает модуль sfml-graphics . Однако управление окном с использование модуля sfml-graphics выполняется также, так что чтение данной статьи важно в любом случае.

Открытие окна

В SFML окна представлены классом sf::Window. Окно может быть создано напрямую из конструктора данного класса:


Первый аргумент — видео режим, определяет размер создаваемого окна (размер области окна, без заголовка окна и границ). Тут мы создали окно размером 800x600 пикселей.

Класс sf::VideoMode имеет интересные статические функции, с помощью которых можно получить разрешение рабочего стола или доступные видео режимы. Советуем посмотреть документацию по этому классу.

Второй аргумент — имя создаваемого окна.

Конструктор класса sf::Window может принять и третий аргумент: стиль, который позволяет вам выбрать, какие украшения и функции вы хотите использовать.

Вы можете использовать любую комбинацию следующих стилей:

sf::Style::None Никаких украшений (используется, например, для загрузочных экранов); этот стиль не может быть использован с другими
sf::Style::Titlebar У окна есть заголовок
sf::Style::Resize Можно изменить размер окна и появляется кнопка открытие на весь экран
sf::Style::Close У окна появляется кнопка закрытия
sf::Style::Fullscreen Окно открывается в полноэкранном режиме; этот стиль не может быть скомбинирован с другими и требует доступный видео режим
sf::Style::Default Стандартный стиль, который является сокращение Titlebar | Resize | Close

Также есть четвертый аргумент, определяющий специфичные опции OpenGL. Эта тема рассматривается более подробно в статье по OpenGL.

Если вы хотите создать окно после создания экземпляра sf::Window или создать окно заново, с другим видео режимом или названием, вы можете использовать функцию create . Она принимает те же аргументы, что и конструктор класса.

Оживление окна

Если вы попробуете выполнить код выше (удалив ". "), вы вряд ли что-то увидите. Во-первых, потому что программа завершается немедленно. Во-вторых, потому что программа не обрабатывает события; так что, даже если вы добавили этот код в бесконечный цикл, вы увидите мертвое окно, которое не может быть перемещено или закрыто.

Давайте добавим немного кода, что бы сделать эту программу более интересной:


Код выше открывает окно и уничтожает его, когда пользователь закрывает его. Давайте посмотрим более детально, как он работает:

Во-первых, мы добавили цикл, который гарантирует, что приложение будет обновляться/дополняться до закрытия окна. Большинство (если не все) SFML программы будут иметь схожую конструкцию; иногда этот цикл называется main loop или game loop.

Затем, первое, что мы хотим сделать внутри нашего цикла — проверить наличие необработанных событий. Обратите внимание, что мы используем цикл while так, чтобы обработать все ожидающие обработки события. Функция pollEvent возвращает true , если есть события, ожидающие обработки, или false , если их нет.

Люди часто забывают о цикле обработки событий, потому что им не нужно обрабатывать события (вместо этого они используют ввод с клавиатуры). Без цикла обработки событий, окно перестанет отвечать на запросы. Важно помнить, что цикл обработки событий имеет две роли: в дополнение к обработке пользовательских событий, это еще и обработка внутренних событий окна, которые могут быть вызваны перемещением или изменением размера окна.

После того, как окно закрылось, основной цикл завершается и программа завершает свое выполнение.

В этот момент, вы, наверное, заметили, что мы не говорили о рисовании чего-то в окне. Как указывалось во введении, это не задача модуля sfml-window . Рисование объектов (спрайтов, текста или фигур) будет обсуждаться в статьях по sfml-graphics .

Чтобы что-то рисовать, вы также можете использовать OpenGL напрямую и игнорировать модуль sfml-graphics . sf::Window создает OpenGL контекст и готова к принятию вызовов к OpenGL. Вы можете более подробно ознакомиться с данной темой в статье по использованию OpenGL.

Не ожидайте увидеть что-то интересное в новом окне: мы можете увидеть какой-нибудь цвет (черный или белый), или содержимое прошлого приложения, использовавшего OpenGL, или… что-то еще.

Играемся с окном

Конечно, SFML позволяет вам играться с вашими окнами. Основные операции с окнами, например изменение размера, положения, названия или иконки поддерживаются, но, в отличие от специальных библиотек GUI (Qt, wxWidgets), SFML не предоставляет расширенный функционал. Окна SFML предназначены только для обеспечения среды для OpenGL или SFML.


Вы можете обратиться к документации по API для получения полного списка функций sf::Window.

В случае, если вам действительно нужны расширенный функционал для вашего окна, вы можете создать одно окно с помощью другой библиотекой и внедрить его в SFML. Чтобы это сделать, вы можете использовать другой конструктор или создать функцию, которая передает sf::Window дескриптор существующего окна. В этом случае, SFML будет создавать контекст рисования внутри переданного окна и отлавливать все события без вмешательства в родительский менеджер окна.


Если вам нужна дополнительная, очень специфичная функция, вы можете сделать иначе: создать окно SFML, получить его дескриптор и сделать то, чего не позволяет SFML.


Интеграция SFML с другими библиотеками требует работы и не будет описана здесь, но вы можете обратиться к другим статьям, примерам или постам на форумах.

Контроль кадровой частоты

Иногда, когда приложение работает быстро, вы можете заметить визуальные артефакты. Причина в том, что частота обновления вашего приложения не синхронизирована с кадровой разверткой вашего монитора, и, как результат, нижняя часть предыдущего кадра смешивается с верхом следующего.

Решением этой проблемы является активизация вертикальной синхронизации. Синхронизация производится автоматически видеокартой и может быть просто включена или выключена с помощью функции setVerticalSyncEnabled :


После этого вызова, приложение будет выполняться с определенной частой, равной частоте обновления монитора.

Иногда вызов setVerticalSyncEnabled не дает никакого эффекта: скорее всего, потому что вертикальная синхронизация выключена в настройках драйвера вашей видеокарты. Вы должны включить опцию «controlled by application» в настройках видеодрайвера.

Вы можете захотеть, чтобы ваше приложение работало на заданной кадровой частоте, вместо частоты обновления монитора. Это может быть достигнуто с помощью вызова setFramerateLimit :


В отличие от setVerticalSyncEnabled , эта функция реализована SFML и использует комбинация sf::Clock и sf::sleep . Важно отметить, что эта функция не является надежной на 100%, особенно для высокой кадровой частоты: возможности sf::sleep зависят от ОС и оборудования; минимальное время приостановки составляет 10-15 миллисекунд. Не полагайтесь на эту функцию, если вы создаете приложение, сильно зависящее от времени.

Никогда не используйте setVerticalSyncEnabled и setFramerateLimit вместе. Это может вызвать плохие последствия.

Вещи, которые нужно знать об окнах

Ниже приведен список того, что вы можете и чего не можете делать с окнами SFML.

Вы можете создавать множество окон

SFML позволяет создавать множество окон, а так же обрабатывать их события и управлять ими в главном потоке или в множестве потоков (но… смотрите ниже). В этом случае, не забудьте создать цикл обработки событий для каждого из них.

Пока что, множество мониторов не поддерживается

SFML неявным образом управляет несколькими мониторами. По этой причине, вы не можете выбрать, на каком мониторе появится окно, и вы не можете создать более одного полноэкранного окна. Это должно быть исправлено в будущих версиях.

События окна должны быть обработаны в потоке окна

Это является серьезным сдерживающим фактором для большинства операционных систем: цикл обработки событий (точнее, функция pollEvent или waitEvent ) должен вызываться в том же потоке, в котором было создано окно. Это означает, что если вы хотите создать выделенный поток для обработки событий, вы должны убедиться, что окно создается в том же потоке. Если вы действительно хотите разделить задачи между потоками, удобнее обрабатывать события в главном потоке, и производить операции с окнами (например, отрисовку графики) в отдельном потоке. Эта конфигурация также будет совместима с других ограничений, описанными ниже.

На Mac OS X обслуживание окон и обработка событий должны производиться в главном потоке

Ага, это правда. Mac OS X не позволит вам создать окно или обработать события в потоке, отличном от главного.

На Windows окно, размером больше рабочего стола, не обрабатывается корректно

По какой-то причине, Windows не позволяет созвать окна, размером больше, чем рабочий стол. Это затрагивает окна, созданные с помощью VideoMode::getDesktopMode() : если вы будете использовать оформление окон (границы и заголовок), вы получите окно, которое будет немного больше, чем рабочий стол.

"A good example is a debugger when it hits a breakpoint."


Добавлено
не работает, причем честно об этом говорит (

Сначала нужно вызвать

SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);

Зтем можно вызывать SetForegroundWindow.

Но это несовсем корректная техника. Для того и изменили поведение функции SetForegroundWindow, чтобы некоторые не доставали своими выскакивающими табличками.

сначала сворачиваем нашу прогу
Application.Minimize;

если "сворачивали в трей", то
if not IsWindowVisible(Application.Handle) then
ShowWindow(Application.Handle, SW_SHOW);

ну и восстанавливаем.
Application.Restore;
а уже при ресторе окно вылазит вперёд

кстати, если кто-то предложит лучший метод (без Minimize), буду очень благодарен

Что значит что с ним что без него?
Функция SystemParametersInfo вообще отработала корректно или ты не проверял на предмет ошибки?

Так вот если не проверял то проверь. Это делается с помощью GetLastError если функция SystemParametersInfo вернёт тебе ноль.

Если же функция отработала успешно, то вызови её же но с параметром SPI_GETFOREGROUNDLOCKTIMEOUT и убедись что она возвратит ноль.

После корректного вызова этой функции и установки свойства SETFOREGROUNDLOCKTIMEOUT в ноль система будет сразу делать окно активным с помощью SetForegroundWindow. Система не будет вызывать функцию FlashWindowEx.

я не знаю, какие у вас винды, а уменя WinXp.
под Win2000 всё точно так же.

Да, такая ситуация тоже возможна и она является штатной. Если текущий foreground-процесс вызвал функцию LockSetForegroundWindow.

Согласен что нужно. Но это просто один из вариантов как всё-таки сделать своё окно поверх всех, даже тогда когда никто этого нехочет и всеми средствами препятствует этому. Появится активное системное модальное окно, а после его закрытия уже делай основым то из своих окно которое необходимо.

На некорректные параметры такую ошибку система не выдаст. С параметрами у него судя по всему всё в порядке. А вот поотключать все лишние запущенные приложения попробовать стоит. Фалит из-за одного из них.

Как Вы уже заметили, все программы, папки и файлы и открываются в рамках и полях, образующих прямоугольники. Эти прямоугольники и есть окна, с которыми мы будем учиться работать: перемещать их, менять размер, сворачивать и закрывать.

Количество открытых окон может быть неограниченным, все зависит от мощности компьютера и Вашего желания. Размер этих окон так же может быть разным: на всю ширину экрана или же совсем маленьким. Для комфортной работы с окнами можно подстраивать размер под себя, сворачивать и закрывать ненужные в данный момент окна.

Стандартные окна имеют одинаковую структуру, откроем любую папку, файл или программу и мы увидим те же элементы, независимо от того, какой размер окна или какая именно открыта программа. Например, сравним окна текстового редактора, элемента управления «мой компьютер» и программы для работы в интернете (браузер) и мы увидим, что совершенно разные объекты откроются в одинаковых окнах, на границах которых имеются кнопки управления:

окна-разных-размеров

Видно, что каждый открытый элемент обрамляет рамка, а в правом верхнем углу находятся кнопки управления окном. Рассмотрим структуру окна подробнее:

Элементы стандартного окна на примере программы «блокнот»

элементы окна

Строка меню включает в себя различные настройки, которые открываются по щелчку левой кнопки мышки(ЛКМ).

Заголовок окна — название открытой программы, папки или файла.

Кнопка сворачивания прячет выделенное нами окно (активное окно) в панель задач (горизонтальную полоску, расположенную внизу экрана). Само окно продолжает работать, просто убирается из нашего поля зрения.

Кнопка развертывания растягивает окно на всю ширину экрана, повторное нажатие на эту кнопку возвращает предыдущий размер окна

Кнопка закрытия — закрывает окно.

Полоса прокрутки появляется, когда размер окна уменьшен настолько, что вся информация не может в нем отображаться. Для просмотра содержимого документа можно нажимать на стрелки сверху и снизу полосы прокрутки ЛКМ, или же на сам ползунок, удерживая ЛКМ и перетаскивая ползунок вниз или вверх. Полоса прокрутки может быть как вертикальной (на изображении выше), так и горизонтальной.

Граница окна и углы окна используются для изменения размера окна, это достигается перетаскиванием их указателем мыши.

Рабочая область окна — непосредственно та часть, с которой взаимодействует пользователь, область, где находится основное содержимое открытого файла, программы или папки.

Часто при работе удобно сразу видеть несколько открытых окон с папками, файлами или программами.

два окна рядом

Чтоб расположить их рядом, нужно переместить окна и при необходимости уменьшить их размеры, если часть необходимой информации не видно.

Как переместить окно

Все очень просто: для перемещения окна необходимо курсор мыши навести на заголовок окна (верхняя часть окна), зажать ЛКМ и, удерживая её, передвинуть туда, куда нужно, после чего отпустить ЛКМ.

Изменение размеров окна

Чтоб изменить размер окна, курсор мыши наводится на границу окна или его угол. Обычный значок курсора превращается в двустороннюю стрелку. Как только значок появился, можно зажимать ЛКМ и перетаскивать границу, делая окно больше или меньше.

Заметьте, если перетащить стрелку к правой или левой границе, то будет изменяться только ширина окна, а если к верхней или нижней границе, то меняться будет высота. А если курсор мыши навести на угол, то изменить можно и ширину и высоту сразу.

Что такое диалоговое окно?

Окна бывают двух типов:

  1. окна программ, папок, документов, которые по структуре одинаковы, мы рассмотрели это выше;
  2. диалоговые окна

Диалоговое окно — это особый вид окна, который требует участия пользователя в виде ответа на поставленный вопрос. Обычно диалоговые окна появляются, когда системе Windows необходимо указание для продолжения дальнейшей работы, например, ей нужно знать, сохранять ли файл перед закрытием программы?

diaogovoe-okno

После появления диалогового окна нужно выбрать один из предоставленных вариантов ответа, нажав соответствующую кнопку.

Что такое активное окно?

Активное окно — это то окно, которое выбрано в данный момент (выбирается левым щелчком мыши). То есть это не какой-то особый тип окна, а обозначение того окна, в котором мы сейчас работаем. Единовременно активным может быть только одно окно. На первой картинке в этом уроке видно три открытых окна, какое же из них активно? Все просто, после клика мыши активное окно сразу переносится на передний план для нашего удобства. На переднем плане окно калькулятора, оно-то и активно.


В данной статье показаны действия, с помощью которых можно включить или отключить активацию окон при наведении на них указателя мыши в операционной системе Windows 7, 8.1 и 10.

Операционная система Windows поддерживает множество дополнительных возможностей, которые не только не используются, но и о которых не знает большинство обычных пользователей. Одной из таких возможностей является функция активации окон при наведении на них указателя мыши.

Включить эту функцию можно двумя способами: используя Центр специальных возможностей классической панели управления или с помощью редактора реестра.

Как включить функцию активации окон при наведении на них указателя мыши используя «Центр специальных возможностей»


Чтобы включить функцию активации окон при наведении на них указателя мыши, откройте панель управления, для этого нажмите сочетание клавиш + R, в открывшемся окне Выполнить введите (скопируйте и вставьте) control и нажмите кнопку OK.


В панели управления, в выпадающем списке Просмотр выберите Мелкие значки и затем выберите Центр специальных возможностей.


В открывшемся окне "Центр специальных возможностей" нажмите на ссылку Упрощение работы с мышью


Затем в окне "Упрощение работы с мышью" в разделе "Упрощенное управление окнами" установите флажок опции Активировать окно при наведении на него указателя мыши и нажмите кнопку OK.


После произведенных действий изменения вступают в силу сразу.

Также для быстрого (прямого) доступа к окну "Упрощение работы с мышью" скопируйте и вставьте команду в диалоговое окно Выполнить или в адресную строку проводника Windows и нажмите клавишу Enter ↵.

control.exe /name Microsoft.EaseOfAccessCenter /page pageEasierToClick

Как включить функцию активации окон при наведении на них указателя мыши с помощью редактора реестра


Чтобы включить функцию активации окон при наведении на них указателя мыши с помощью редактора реестра, нажмите сочетание клавиш + R, в открывшемся окне Выполнить введите (скопируйте и вставьте) regedit и нажмите кнопку OK.


В открывшемся окне редактора реестра перейдите по следующему пути:

Затем в разделе Desktop, в правой части окна найдите параметр с именем UserPreferencesMask.


Здесь нас интересует первый байт 9E. Если заменить его на 9F, то окно будет активироваться, но не будет выводиться на передний план. Если задать значение DF, то окна будут активироваться и выводиться на передний план.

Дважды щелкните по параметру UserPreferencesMask левой кнопкой мыши и в открывшемся окне измените первый байт на DF или 9F (в данном примере выбрано значение первого байта DF) и нажмите кнопку OK.


Также в этом разделе реестра можно изменить интервал удержания указателя мыши на окне, по истечении которого окно станет активным. Для этого найдите параметр ActiveWndTrkTimeout, дважды щелкните по параметру левой кнопкой мыши и в открывшемся окне установите переключатель системы исчисления Десятичная, в поле "Значение:" установите нужное значение в миллисекундах (1000 миллисекунд = 1 секунда) и нажмите кнопку OK.


Чтобы изменения вступили в силу потребуется выход из системы и повторный вход.

Используя рассмотренные выше действия, можно включить или отключить активацию окон при наведении на них указателя мыши в операционной системе Windows 7, 8.1 и 10.

Читайте также: