Сворачивание окна windows forms

Как использовать OAuth2 со Spring Security в Java

Javaican 14.05.2025

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

Анализ текста на Python с NLTK и Spacy

AI_Generated 14.05.2025

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

Реализация DI в PHP

Jason-Webb 13.05.2025

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

Обработка изображений в реальном времени на C# с OpenCV

stackOverflow 13.05.2025

Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .

POCO, ACE, Loki и другие продвинутые C++ библиотеки

NullReferenced 13.05.2025

В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .

Паттерны проектирования GoF на C#

UnmanagedCoder 13.05.2025

Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .

Создаем CLI приложение на Python с Prompt Toolkit

py-thonny 13.05.2025

Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .

Конвейеры ETL с Apache Airflow и Python

AI_Generated 13.05.2025

ETL-конвейеры – это набор процессов, отвечающих за извлечение данных из различных источников (Extract), их преобразование в нужный формат (Transform) и загрузку в целевое хранилище (Load). . . .

Выполнение асинхронных задач в Python с asyncio

py-thonny 12.05.2025

Современный мир программирования похож на оживлённый мегаполис – тысячи процессов одновременно требуют внимания, ресурсов и времени. В этих джунглях операций возникают ситуации, когда программа. . .

Работа с gRPC сервисами на C#

UnmanagedCoder 12.05.2025

gRPC (Google Remote Procedure Call) — открытый высокопроизводительный RPC-фреймворк, изначально разработанный компанией Google. Он отличается от традиционых REST-сервисов как минимум тем, что. . .

{lang: ‘ru’}

Этот пост открывает серию статей, посвященных работе с треем. Описывать все в одном посте я не буду по одной причине: некоторые аспекты теряются за другими. Сначала я действительно написал статью под заголовком «Как реализовать сворачивание в трей на C#», однако по запросу «сворачивание в трей» на нее пришел только один человек. Остальные же искали нечто другое, не указанное в заголовке статьи, однако, естественно, затронутое в ней. И я не уверен, что, посмотрев на заголовок, они тут же не закрыли вкладку. Не все же будут лезть в конец страницы, если не уверены, что там будет ответ. Я и сам не всегда проверяю, где же на странице находится то, что по мнению поисковика я искал. В конечном итоге написание серии относительно коротких постов должно привести к двум приятностям: повышению релевантности страниц и более удобному поиску материала (это уже для меня лично, чтобы не забыть что и где).

Итак. За работу с областью уведомлений (или треем) в С# отвечает класс NotifyIcon. В нем есть несколько полезных свойств, которые позволяют:

  • назначить значок (свойство Icon);
  • указать контекстное меню для значка (свойство ContextMenu);
  • определить тест-подсказку (свойство Text);
  • свойство Visible позволяет скрыть значок в трее.

Перед использованием его естественно следует «кинуть» на форму в визуальном редакторе или объявить в ручную.

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

    using System;

    using System.Drawing;

    using System.Windows.Forms;

    namespace rosskyru

    {

        public partial class FormForTray : Form

        {

            ///

            /// конструктор формы

            ///

            public FormForTray()

            {

                InitializeComponent();

                //задаем всплывающий текст-подсказку (появляется при наведении указателя на иконку в трее)

                _notifyIcon.Text = «Текст-подсказка»;

                //устанавливаем значок, отображаемый в трее:

                //либо один из стандартных:

                //_notifyIcon.Icon = SystemIcons.Error;

                //либо свой из файла:

                _notifyIcon.Icon = new Icon(«favicon.ico»);

                //подписываемся на событие клика мышкой по значку в трее

                _notifyIcon.MouseClick += new MouseEventHandler(_notifyIcon_MouseClick);

                //подписываемся на событие изменения размера формы

                this.Resize += new EventHandler(FormForTray_Resize);

            }

            ///

            /// здесь хранится состояние окна до сворачивания (максимизированное или нормальное)

            ///

            private FormWindowState _OldFormState;

            ///

            /// обрабатываем событие клика мышью по значку в трее

            ///

            void _notifyIcon_MouseClick(object sender, MouseEventArgs e)

            {

                //проверяем, какой кнопкой было произведено нажатие

                if (e.Button == MouseButtons.Left)//если левой кнопкой мыши

                {

                    //проверяем текущее состояние окна

                    if (WindowState == FormWindowState.Normal || WindowState == FormWindowState.Maximized)//если оно развернуто

                    {

                        //сохраняем текущее состояние

                        _OldFormState = WindowState;

                        //сворачиваем окно

                        WindowState = FormWindowState.Minimized;

                        //скрываться в трей оно будет по событию Resize (изменение размера), которое сгенерировалось после минимизации строчкой выше

                    }

                    else//в противном случае

                    {

                        //и показываем на нанели задач

                        Show();

                        //разворачиваем (возвращаем старое состояние «до сворачивания»)

                        WindowState = _OldFormState;

                    }

                }

            }

            ///

            /// обрабатываем событие изменения размера

            ///

            void FormForTray_Resize(object sender, EventArgs e)

            {

                if (FormWindowState.Minimized == WindowState)//если окно «свернуто»

                {

                    //то скрываем его

                    Hide();

                }

            }

        }

    }

Надеюсь, что комментарии в коде объясняют все нюансы программы.

Она делает всего две вещи:

  • сворачивается и разворачивается из трея по щелчку левой кнопки мыши на значке в области уведомлений;
  • запоминает свое старое состояние и разворачивается сразу в него (т.е. если она была развернута на весь экран, а потом свернута в трей, то восстановится она снова на весь экран).

И, напоследок, архив с этим проектом.

Полезная статья? Их будет больше, если вы поддержите меня!

Всем привет, сегодня учимся сворачивать в трей программу написанную в C#. Итак создаем новый проект «Приложение Windows Forms». Переходим в конструктор форм и жмем «панель инструментов». Ищем элемент «NotifyIcon»
 

и перетаскиваем его на нашу форму.
 

Как видите он появился с низу, и если по нему кликнуть снизу, откроются свойства.

В свойствах нас интересуют параметры: Text, Icon. В Text мы задаем тот текст, который будет показываться при наведении на иконку в трее, Icon — та самая иконка что будет показываться, поэтому обязательно сделайте (я делал в GIMP’е) или найдите в интернете.

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

Моя форма называется w1 и следовательно функция конструктора тоже называется w1, вот начала кода:

using System;
using System.Windows.Forms;

namespace FwLogger
{
    public partial class w1 : Form
    {
        public w1()
        {
            InitializeComponent();
         }
    }
}

Далее в конструктор класса мы добавляем код и все связанные с ним функции, и вот у нас получается:
 

        public w1()
        {
            InitializeComponent();
	    // делаем невидимой нашу иконку в трее
            notifyIcon1.Visible = false;
	    // добавляем Эвент или событие по 2му клику мышки, 
	    //вызывая функцию  notifyIcon1_MouseDoubleClick
            this.notifyIcon1.MouseDoubleClick += new MouseEventHandler(notifyIcon1_MouseDoubleClick);
	    
            // добавляем событие на изменение окна
            this.Resize += new System.EventHandler(this.Form1_Resize);
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
	    // проверяем наше окно, и если оно было свернуто, делаем событие        
	    if (WindowState == FormWindowState.Minimized)
            {
		// прячем наше окно из панели
                this.ShowInTaskbar = false; 
		// делаем нашу иконку в трее активной
                notifyIcon1.Visible = true;
            }
        }


        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
	    // делаем нашу иконку скрытой
            notifyIcon1.Visible = false;
	    // возвращаем отображение окна в панели
            this.ShowInTaskbar = true; 
	    //разворачиваем окно
            WindowState = FormWindowState.Normal;
        }

C# Windows Form Свернуть, Развернуть, Свернуть в окно, Закрыть

    // Свернуть
    WindowState = FormWindowState.Minimized;
    // Развернуть , Свернуть в окно:
    if (WindowState == FormWindowState.Maximized)
    {
        WindowState = FormWindowState.Normal;
    }
    else if (WindowState == FormWindowState.Normal)
    {
        WindowState = FormWindowState.Maximized;
    }
    // Закрыть всплывающее или диалоговое окно
    this.Close();
 
    // Если нужно закрыть всё приложение со всеми окнами
    Application.Exit();


Сворачивание окна

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,

    каке событие в С# для окна отвечает за его сворачивание ?


    Twilight



    Сообщ.
    #2

    ,

      Senior Member

      Рейтинг (т): 24

      Скорее всего придется перехватывать события, которые винда посылает окну — это если нужно отловить сам момент сворачивания.
      Если нужно отлавливать уже измененное состояние, то событие SizeChanged() в котором смотри на свойство WindowState.


      cthutq



      Сообщ.
      #3

      ,

        Twilight, спасибо — вроде получилось.

        Я отловил этот момент и делаю форму Visible = false;
        Для того, чтоб ее достать я дважды щелкаю на иконку в трее и она показывается
        this.Visible = true;
        this.WindowState = FormWindowState.Normal.

        Но вот никак не могу при запуске приложения эту форму сразу свернуть.
        Тоесть this.Visible = false не работает ни после инициадизации компонент, ни после FormLoad.

        Как ее запустить нефидимой ? или может есть какие свойства у компанент, чтоб это автоматом делалось ?


        Twilight



        Сообщ.
        #4

        ,

          Senior Member

          Рейтинг (т): 24

          Невидимой всмысле свернутой? Если так — то WindowState в Minimized ставь перед отображением формы


          cthutq



          Сообщ.
          #5

          ,

            а отлавлю ли я тогда событие, если форма сразу показывается свернутой. Тоесть изменение размеров-то не произойдет… (SizeChanged)


            Twilight



            Сообщ.
            #6

            ,

              Senior Member

              Рейтинг (т): 24

              отловишь


              cthutq



              Сообщ.
              #7

              ,

                Цитата Twilight @

                отловишь

                а вот почему-то и не отлавливается


                Twilight



                Сообщ.
                #8

                ,

                  Senior Member

                  Рейтинг (т): 24

                  показывай код, раз не отлавливается


                  cthutq



                  Сообщ.
                  #9

                  ,

                    Цитата Twilight @

                    показывай код, раз не отлавливается

                    да особо показывать-то и нечего

                    в общем событие при запуске приходит. Причем 2 раза.
                    Я делаю Visible = false, но после этого окно все-равно отображается свернутым в панели задач.
                    А хотелось бы при запуске его доставать только из трея.

                    Может как по-другому еще можно ?


                    wdk



                    Сообщ.
                    #10

                    ,

                      ShowInTaskbar=false;


                      Twilight



                      Сообщ.
                      #11

                      ,

                        Senior Member

                        Рейтинг (т): 24

                        Цитата cthutq @

                        в общем событие при запуске приходит. Причем 2 раза.

                        что впринципе логично — создание окна и сворачивание окна


                        arbuzov



                        Сообщ.
                        #12

                        ,

                          Full Member

                          Рейтинг (т): 13

                          Цитата cthutq @

                          А хотелось бы при запуске его доставать только из трея.

                          Ты чего спросить то хотел? Про сворачивание формы или про то как поместить программу в трей?
                          Если первое то тебе цуже ответили. если второе, то NotifyIcon используй.


                          cthutq



                          Сообщ.
                          #13

                          ,

                            Цитата wdk @

                            ShowInTaskbar=false;

                            это что ?

                            Цитата Twilight @

                            что впринципе логично — создание окна и сворачивание окна

                            да, но мне от этого не легче форма-то показывается

                            Цитата arbuzov @

                            Ты чего спросить то хотел? Про сворачивание формы или про то как поместить программу в трей?
                            Если первое то тебе цуже ответили. если второе, то NotifyIcon используй.

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


                            arbuzov



                            Сообщ.
                            #14

                            ,

                              Full Member

                              Рейтинг (т): 13

                              Цитата wdk @

                              ShowInTaskbar=false;

                              +

                                private void fmMain_Activated(object sender, EventArgs e)

                                        {

                                            Hide();

                                        }

                              зы а зачем форму создавать если ее сразу скрывать?

                              Сообщение отредактировано: arbuzov


                              cthutq



                              Сообщ.
                              #15

                              ,

                                Цитата arbuzov @

                                зы а зачем форму создавать если ее сразу скрывать?

                                при ее инициализации происходит сетевое соединенние с сервером.

                                попробую с Hide() & ShowInTaskbar.

                                З.Ы. Нашел примерчик с ShowInTaskbar

                                   private void frmMain_Resize(object sender, System.EventArgs e)

                                  {

                                  ShowInTaskbar = !(this.WindowState == FormWindowState.Minimized);

                                  notifyIcon1.Visible = this.WindowState == FormWindowState.Minimized;

                                  }

                                  private void notifyIcon1_Click(object sender, System.EventArgs e)

                                  {

                                  this.WindowState = FormWindowState.Normal;

                                  }

                                но почему-то слетает с исключением при создании окна


                                Twilight



                                Сообщ.
                                #16

                                ,

                                  Senior Member

                                  Рейтинг (т): 24

                                  Цитата cthutq @

                                  при ее инициализации происходит сетевое соединенние с сервером.

                                  Если по хорошему — то надо разделять код представления (UI) от бизнес-логики, хотя бы разнеся их по разным классам, а еще лучше в разные namespaces

                                  Цитата cthutq @

                                  но почему-то слетает с исключением при создании окна

                                  все вот надо клещами вытягивать какое исключение?


                                  arbuzov



                                  Сообщ.
                                  #17

                                  ,

                                    Full Member

                                    Рейтинг (т): 13

                                    Цитата Twilight @

                                    Если по хорошему — то надо разделять код представления (UI) от бизнес-логики

                                    +1
                                    Соединение с сервером незачем привязывать к создапнию главной формы


                                    Pit-Bul



                                    Сообщ.
                                    #18

                                    ,

                                      вот тоже сталкивался с такими проблемами и решил добавить вопросик по тем

                                      все вышесказанное(имеется в виду отлавливание сворачивания через ресайз окна) работает при условии что у формы например FormBorderStyle = FormBorderStyle.FixedToolWindow, или другой фиксированный, но как быть если FormBorderStyle = FormBorderStyle.Sizable. В этом случае события которые должны происходить при сворачивании формы будут срабатывать при каждом ресайзе формы


                                      cthutq



                                      Сообщ.
                                      #19

                                      ,

                                        Цитата Twilight @

                                        Если по хорошему — то надо разделять код представления (UI) от бизнес-логики, хотя бы разнеся их по разным классам, а еще лучше в разные namespaces

                                        у меня класс отвечающий за соединение находится в отдельном классе и в отдельном namespace.
                                        Но сам класс-то является членом класса-формы. При запуске формы происходит попытка соединения и если удачно, то
                                        доступны некие кнопки.

                                        Интересно — как это можно разнести ?


                                        Twilight



                                        Сообщ.
                                        #20

                                        ,

                                          Senior Member

                                          Рейтинг (т): 24

                                          Цитата Pit-Bul @

                                          но как быть если FormBorderStyle = FormBorderStyle.Sizable.

                                          можно делать по-простому — запоминать предыдущее состояние WindowState и сравнивать с текущим — не ихменилось — событие не о том что нам надо.
                                          Если делать по-хорошему, то переопределить оконную процедуру и отлавливать в ней события минимизации и максимизации. Впринципе добавится строк 10 кода. Мне больше этот вариант нравится. Еще хорош он и тем, что отлавливать эти события будешь в момент их возникновения, а не пост-фактум как с ловлей изменения размеров окна, т.е. если надо, сможешь его отменить.

                                          Цитата cthutq @

                                          Интересно — как это можно разнести ?

                                          мое мнение вынести вызов метода соединения с сервером из конструктора в другое место, когда форма уже будет загружена.

                                          Сообщение отредактировано: Twilight


                                          e-moe



                                          Сообщ.
                                          #21

                                          ,

                                            Цитата Twilight @

                                            Скорее всего придется перехватывать события, которые винда посылает окну — это если нужно отловить сам момент сворачивания.
                                            Если нужно отлавливать уже измененное состояние, то событие SizeChanged() в котором смотри на свойство WindowState.

                                            Сори что старую тему поднял…
                                            Может лучше добавить свое событие, перекрыть свойство WindowState и при его вызове щелкать событием?
                                            И возможно ли такое?
                                            Просто как по мне способ с SizeChanged не очень красивый…


                                            freeway



                                            Сообщ.
                                            #22

                                            ,

                                              Full Member

                                              Рейтинг (т): 1

                                              меня интересует тот же вопрос:

                                              все прекрасно работает:

                                                        private void Main_f_Resize(object sender, EventArgs e)

                                                        {

                                                            if (FormWindowState.Minimized == WindowState) Hide();

                                                        }

                                                        private void notifyIcon_DoubleClick(object sender, EventArgs e)

                                                        {

                                                            Show();

                                                            WindowState = FormWindowState.Normal;

                                                        }

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

                                                        private void Main_f_Activated(object sender, EventArgs e)

                                                        {

                                                            this.Hide();

                                                         }

                                              теперь порядок — прога при старте сразу в трее, но чтоб ее оттуда достать, надо сделать на notifyIcon три двойных щелчка))))
                                              причем видно, на первые 2 она реагирует и тут же заворачивается, а на третий остается развернутой)
                                              Подскажите как поправить?


                                              wdk



                                              Сообщ.
                                              #23

                                              ,

                                                Почему бы просто не поставить Visible=false у формы в дизайнере?


                                                hd44780



                                                Сообщ.
                                                #24

                                                ,

                                                  Senior Member

                                                  Рейтинг (т): 25

                                                  У формы есть методы Hide и Show — спрятать/показать форму.
                                                  Но в конструкторе или FormLoad они не срабатывают. Я сделал так — в FormLoad запускаю таймер на 0.5-1 сек, в событии этого таймера делаю Hide, после чего таймер выключаю.
                                                  Форма висит эти 0.5-1 сек и исчезает. А дальше юзер из меню иконы в трее ее показывает/прячет когда захочет.
                                                  Показать/спрятать — пункты меню. В обработчиках просто стоит this.Hide (); либо this.Show ().
                                                  В этих же обработчиках можно флаг свой переключать — форма спрятана или нет.
                                                  Проблем у меня с таким подходом никогда не возникало.

                                                  Сообщение отредактировано: hd44780


                                                  TerraGhost



                                                  Сообщ.
                                                  #25

                                                  ,

                                                    Senior Member

                                                    Рейтинг (т): 63

                                                      Но в конструкторе или FormLoad они не срабатывают. Я сделал так — в FormLoad запускаю таймер на 0.5-1 сек, в событии этого таймера делаю Hide, после чего таймер выключаю.

                                                      Форма висит эти 0.5-1 сек и исчезает.

                                                    Тихий ужас

                                                    Алсо, как же вы всё сложно придумываете, не проще ли завести отдельное свойство которое будет отвечать за показ формы? Пусть это будет «IsMinimized», вот простейший пример:

                                                              private FormWindowState LastWindowState;

                                                              private bool IsMinimized

                                                              {

                                                                  get

                                                                  {

                                                                      return this.WindowState == FormWindowState.Minimized;

                                                                  }

                                                                  set

                                                                  {

                                                                      if (this.IsMinimized == value)

                                                                      {

                                                                          return;

                                                                      }

                                                                      if (value)

                                                                      {

                                                                          this.WindowState = FormWindowState.Minimized;

                                                                          this.ShowInTaskbar = false;

                                                                          this.Hide ();

                                                                      }

                                                                      else

                                                                      {

                                                                          this.Show ();                    

                                                                          this.ShowInTaskbar = true;

                                                                          this.WindowState = this.LastWindowState;

                                                                      }

                                                                  }

                                                              }

                                                              private void MainForm_Resize (object sender, EventArgs e)

                                                              {

                                                                  if (this.IsMinimized)

                                                                  {

                                                                      this.ShowInTaskbar = false;

                                                                      this.Hide ();

                                                                  }

                                                                  else

                                                                  {

                                                                      this.LastWindowState = this.WindowState;

                                                                  }

                                                              }

                                                    И использовать его для скрытия/показа формы в процессе работы:

                                                              private void NotifyIcon_Main_MouseClick (object sender, MouseEventArgs e)

                                                              {

                                                                  if (!this.Created || e.Button != MouseButtons.Left)

                                                                  {

                                                                      return;

                                                                  }

                                                                  this.IsMinimized = !this.IsMinimized;

                                                              }

                                                    И в процессе загрузки формы:

                                                              private void MainForm_Load (object sender, EventArgs e)

                                                              {

                                                                  this.IsMinimized = this.CheckBox_AutoHide.Checked; //Properties.Settings.Default.AutoHide

                                                              }

                                                              private void Form1_FormClosing (object sender, FormClosingEventArgs e)

                                                              {

                                                                  Properties.Settings.Default.AutoHide = this.CheckBox_AutoHide.Checked;

                                                                  Properties.Settings.Default.Save ();

                                                              }

                                                    Пример на 10 строк в аттаче.

                                                    Сообщение отредактировано: TerraGhost


                                                    Прикреплённый файлMinimizedToTray.rar (7.46 Кбайт, скачиваний: 68)


                                                    freeway



                                                    Сообщ.
                                                    #26

                                                    ,

                                                      Full Member

                                                      Рейтинг (т): 1

                                                      TerraGhost спасибо за пример)
                                                      а я сделал так:
                                                      в свойстве формы WindowsState установил — Minimized
                                                      и

                                                                public Main_f()

                                                                {

                                                                    InitializeComponent();

                                                                    this.ShowInTaskbar = false;

                                                                }

                                                                private void notifyIcon_DoubleClick(object sender, EventArgs e)

                                                                {

                                                                    Show();

                                                                    WindowState = FormWindowState.Normal;

                                                                    this.ShowInTaskbar = true;

                                                                }

                                                      все как надо работает.))

                                                      Сообщение отредактировано: freeway

                                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                                      0 пользователей:

                                                      • Предыдущая тема
                                                      • .NET: Общие вопросы
                                                      • Следующая тема

                                                      [ Script execution time: 0,0565 ]   [ 16 queries used ]   [ Generated: 14.05.25, 10:33 GMT ]  

                                                      Понравилась статья? Поделить с друзьями:
                                                      0 0 голоса
                                                      Рейтинг статьи
                                                      Подписаться
                                                      Уведомить о
                                                      guest

                                                      0 комментариев
                                                      Старые
                                                      Новые Популярные
                                                      Межтекстовые Отзывы
                                                      Посмотреть все комментарии
                                                    • Sip клиент для windows portable
                                                    • Не работает кнопка завершения работы windows 10
                                                    • Файловый сервер на linux в домене windows
                                                    • Windows 10 не видит диск raw
                                                    • Как установить блютуз на компьютер windows 10 ютуб