From 3181157b7ca44070804bdf87e803c946534fed5a Mon Sep 17 00:00:00 2001 From: wildtail Date: Mon, 2 Mar 2026 02:50:17 +0300 Subject: [PATCH] add tray --- .gitignore | 5 +++ HttpKeys/App.xaml.cs | 43 +++++++++++++++++++-- HttpKeys/HttpKeys.csproj | 7 ++++ HttpKeys/Listener.cs | 73 ++++++++++++++++++++++++++++++++++++ HttpKeys/MainWindow.xaml | 8 +++- HttpKeys/MainWindow.xaml.cs | 30 ++++++++++++++- HttpKeys/app.ico | Bin 0 -> 67646 bytes 7 files changed, 160 insertions(+), 6 deletions(-) create mode 100644 HttpKeys/Listener.cs create mode 100644 HttpKeys/app.ico diff --git a/.gitignore b/.gitignore index e69de29..eb0ddd7 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,5 @@ +bin/ +obj/ +.idea +.vs +*.user \ No newline at end of file diff --git a/HttpKeys/App.xaml.cs b/HttpKeys/App.xaml.cs index a804fab..f0e5026 100644 --- a/HttpKeys/App.xaml.cs +++ b/HttpKeys/App.xaml.cs @@ -1,6 +1,5 @@ -using System.Configuration; -using System.Data; -using System.Windows; +using System.Windows; +using Application = System.Windows.Application; namespace HttpKeys; @@ -9,5 +8,43 @@ namespace HttpKeys; /// public partial class App : Application { + private NotifyIcon _trayIcon; + + protected override void OnStartup(StartupEventArgs e) + { + base.OnStartup(e); + + _trayIcon = new NotifyIcon + { + Icon = new System.Drawing.Icon("app.ico"), + Visible = true, + Text = "My WPF Tray App" + }; + + var menu = new ContextMenuStrip(); + menu.Items.Add("Открыть", null, (s, ev) => ShowMainWindow()); + menu.Items.Add("Выход", null, (s, ev) => ExitApplication()); + + _trayIcon.ContextMenuStrip = menu; + _trayIcon.DoubleClick += (s, ev) => ShowMainWindow(); + } + + private void ShowMainWindow() + { + if (MainWindow == null) + MainWindow = new MainWindow(); + + MainWindow.ShowInTaskbar = true; // вернуть в панель задач + MainWindow.Show(); + MainWindow.WindowState = WindowState.Normal; + MainWindow.Activate(); + } + + private void ExitApplication() + { + _trayIcon.Visible = false; + _trayIcon.Dispose(); + Shutdown(); + } } diff --git a/HttpKeys/HttpKeys.csproj b/HttpKeys/HttpKeys.csproj index 212659c..9b070f9 100644 --- a/HttpKeys/HttpKeys.csproj +++ b/HttpKeys/HttpKeys.csproj @@ -6,6 +6,13 @@ enable enable true + true + + + PreserveNewest + + + diff --git a/HttpKeys/Listener.cs b/HttpKeys/Listener.cs new file mode 100644 index 0000000..8cf4d2e --- /dev/null +++ b/HttpKeys/Listener.cs @@ -0,0 +1,73 @@ +using System.IO; +using System.Net; +using System.Text; +using System.Text.Json; + +namespace HttpKeys; + + +class Params +{ + public string ActionId { get; set; } = null!; + public string State { get; set; } = null!; + public bool ToggleChanged { get; set; } +} + + +public class Listener +{ + public event Action Log; + + public async Task Run() + { + var listener = new HttpListener(); + listener.Prefixes.Add("http://127.0.0.1:16888/"); + + listener.Start(); + Log("Listening on http://127.0.0.1:16888/"); + + var options = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true // чтобы Email/email/EMAIL не ломалось + }; + + while (true) + { + var ctx = await listener.GetContextAsync(); + + try + { + + if (ctx.Request.RawUrl != "/press") + { + continue; + } + + using var reader = new StreamReader( + ctx.Request.InputStream, + ctx.Request.ContentEncoding + ); + + var body = await reader.ReadToEndAsync(); + var p = JsonSerializer.Deserialize(body, options); + if (p == null) + continue; + + Log("---- REQUEST ----"); + Log("URL: " + p.ActionId); + Log("URL: " + p.State); + Log("URL: " + p.ToggleChanged); + + var responseBytes = "OK"u8.ToArray(); + ctx.Response.StatusCode = 200; + ctx.Response.ContentType = "text/plain; charset=utf-8"; + await ctx.Response.OutputStream.WriteAsync(responseBytes); + ctx.Response.Close(); + } + catch (Exception ex) + { + Log("Error: " + ex.Message); + } + } + } +} \ No newline at end of file diff --git a/HttpKeys/MainWindow.xaml b/HttpKeys/MainWindow.xaml index b9f82bb..e826a9e 100644 --- a/HttpKeys/MainWindow.xaml +++ b/HttpKeys/MainWindow.xaml @@ -5,8 +5,12 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:HttpKeys" mc:Ignorable="d" - Title="MainWindow" Height="450" Width="800"> + Title="MainWindow" Height="450" Width="800" + ShowInTaskbar="True"> - + diff --git a/HttpKeys/MainWindow.xaml.cs b/HttpKeys/MainWindow.xaml.cs index 0829d0d..2ff298b 100644 --- a/HttpKeys/MainWindow.xaml.cs +++ b/HttpKeys/MainWindow.xaml.cs @@ -1,4 +1,6 @@ -using System.Text; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; @@ -16,8 +18,34 @@ namespace HttpKeys; /// public partial class MainWindow : Window { + public ObservableCollection Logs { get; } = new(); + public Listener _listener; + public MainWindow() { + _listener = new Listener(); + _listener.Log += Log; + InitializeComponent(); + DataContext = this; + Closing += MainWindow_Closing; + Hide(); + ShowInTaskbar = false; // убрать из панели задач + + Task.Run(async () => await _listener.Run()); + } + + private void MainWindow_Closing(object? sender, CancelEventArgs e) + { + e.Cancel = true; + + Hide(); + ShowInTaskbar = false; // убрать из панели задач + } + + private void Log(string log) + { + Dispatcher.Invoke(() => Logs.Add($"{DateTime.Now}:: {log}")); + Console.WriteLine(log); } } \ No newline at end of file diff --git a/HttpKeys/app.ico b/HttpKeys/app.ico new file mode 100644 index 0000000000000000000000000000000000000000..48c7844d13712ff29c50ac2d1116559f05838151 GIT binary patch literal 67646 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 AE&u=k literal 0 HcmV?d00001