Как использовать 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();
Сворачивание окна
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
каке событие в С# для окна отвечает за его сворачивание ? |
Twilight |
|
Senior Member Рейтинг (т): 24 |
Скорее всего придется перехватывать события, которые винда посылает окну — это если нужно отловить сам момент сворачивания. |
cthutq |
|
Twilight, спасибо — вроде получилось. Я отловил этот момент и делаю форму Visible = false; Но вот никак не могу при запуске приложения эту форму сразу свернуть. Как ее запустить нефидимой ? или может есть какие свойства у компанент, чтоб это автоматом делалось ? |
Twilight |
|
Senior Member Рейтинг (т): 24 |
Невидимой всмысле свернутой? Если так — то WindowState в Minimized ставь перед отображением формы |
cthutq |
|
а отлавлю ли я тогда событие, если форма сразу показывается свернутой. Тоесть изменение размеров-то не произойдет… (SizeChanged) |
Twilight |
|
Senior Member Рейтинг (т): 24 |
отловишь |
cthutq |
|
Цитата Twilight @ отловишь а вот почему-то и не отлавливается |
Twilight |
|
Senior Member Рейтинг (т): 24 |
показывай код, раз не отлавливается |
cthutq |
|
Цитата Twilight @ показывай код, раз не отлавливается да особо показывать-то и нечего в общем событие при запуске приходит. Причем 2 раза. Может как по-другому еще можно ? |
wdk |
|
ShowInTaskbar=false; |
Twilight |
|
Senior Member Рейтинг (т): 24 |
Цитата cthutq @ в общем событие при запуске приходит. Причем 2 раза. что впринципе логично — создание окна и сворачивание окна |
arbuzov |
|
Full Member Рейтинг (т): 13 |
Цитата cthutq @ А хотелось бы при запуске его доставать только из трея.
Ты чего спросить то хотел? Про сворачивание формы или про то как поместить программу в трей? |
cthutq |
|
Цитата wdk @ ShowInTaskbar=false; это что ? Цитата Twilight @ что впринципе логично — создание окна и сворачивание окна да, но мне от этого не легче форма-то показывается Цитата arbuzov @ Ты чего спросить то хотел? Про сворачивание формы или про то как поместить программу в трей?
Сворачивание я понял как отловить. NotifyIcon использую, но мне нужно через NotifyIcon управлять формой. |
arbuzov |
|
Full Member Рейтинг (т): 13 |
Цитата wdk @ ShowInTaskbar=false; +
private void fmMain_Activated(object sender, EventArgs e) { Hide(); } зы а зачем форму создавать если ее сразу скрывать? Сообщение отредактировано: arbuzov — |
cthutq |
|
Цитата 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 |
|
Senior Member Рейтинг (т): 24 |
Цитата cthutq @ при ее инициализации происходит сетевое соединенние с сервером. Если по хорошему — то надо разделять код представления (UI) от бизнес-логики, хотя бы разнеся их по разным классам, а еще лучше в разные namespaces Цитата cthutq @ но почему-то слетает с исключением при создании окна все вот надо клещами вытягивать какое исключение? |
arbuzov |
|
Full Member Рейтинг (т): 13 |
Цитата Twilight @ Если по хорошему — то надо разделять код представления (UI) от бизнес-логики
+1 |
Pit-Bul |
|
вот тоже сталкивался с такими проблемами и решил добавить вопросик по тем все вышесказанное(имеется в виду отлавливание сворачивания через ресайз окна) работает при условии что у формы например FormBorderStyle = FormBorderStyle.FixedToolWindow, или другой фиксированный, но как быть если FormBorderStyle = FormBorderStyle.Sizable. В этом случае события которые должны происходить при сворачивании формы будут срабатывать при каждом ресайзе формы |
cthutq |
|
Цитата Twilight @ Если по хорошему — то надо разделять код представления (UI) от бизнес-логики, хотя бы разнеся их по разным классам, а еще лучше в разные namespaces
у меня класс отвечающий за соединение находится в отдельном классе и в отдельном namespace. Интересно — как это можно разнести ? |
Twilight |
|
Senior Member Рейтинг (т): 24 |
Цитата Pit-Bul @ но как быть если FormBorderStyle = FormBorderStyle.Sizable.
можно делать по-простому — запоминать предыдущее состояние WindowState и сравнивать с текущим — не ихменилось — событие не о том что нам надо. Цитата cthutq @ Интересно — как это можно разнести ? мое мнение вынести вызов метода соединения с сервером из конструктора в другое место, когда форма уже будет загружена. Сообщение отредактировано: Twilight — |
e-moe |
|
Цитата Twilight @ Скорее всего придется перехватывать события, которые винда посылает окну — это если нужно отловить сам момент сворачивания.
Сори что старую тему поднял… |
freeway |
|
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 три двойных щелчка)))) |
wdk |
|
Почему бы просто не поставить Visible=false у формы в дизайнере? |
hd44780 |
|
Senior Member Рейтинг (т): 25 |
У формы есть методы Hide и Show — спрятать/показать форму. Сообщение отредактировано: hd44780 — |
TerraGhost |
|
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 —
|
freeway |
|
Full Member Рейтинг (т): 1 |
TerraGhost спасибо за пример)
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 ]