C#: GUI to display realtime messages from Windows Service

后端 未结 8 1632
盖世英雄少女心
盖世英雄少女心 2020-12-03 06:04

I\'ve written a C# windows service which can write messages to a custom EventLog or to any number of files. These messages are all marked with some priority (so, for exampl

8条回答
  •  伪装坚强ぢ
    2020-12-03 06:49

    I've found that a Named Pipe communication with a System Tray application was the simplest way to display notifications from a Windows Service. This is because in Windows 10 services run with different permissions than the logged in user, so the notification app needs to perform IPC with the service.

    Here you could put this into the server:

    using System;
    using System.IO;
    using System.IO.Pipes;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleServerApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                StartServer();
                Task.Delay(1000).Wait();
            }
    
            static void StartServer()
            {
                Task.Factory.StartNew(() =>
                {
                    var server = new NamedPipeServerStream("PipesOfPiece");
                    server.WaitForConnection();
                    StreamReader reader = new StreamReader(server);
                    StreamWriter writer = new StreamWriter(server);
                    while (true)
                    {
                        var line = reader.ReadLine();
                        writer.WriteLine(String.Join("", line.Reverse()));
                        writer.Flush();
                    }
                });
            }
        }
    }
    

    Then put this into your client:

    using System;
    using System.IO;
    using System.IO.Pipes;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleClientApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Client
                var client = new NamedPipeClientStream("PipesOfPiece");
                client.Connect();
                StreamReader reader = new StreamReader(client);
                StreamWriter writer = new StreamWriter(client);
    
                while (true)
                {
                    string input = Console.ReadLine();
                    if (String.IsNullOrEmpty(input)) break;
                    writer.WriteLine(input);
                    writer.Flush();
                    Console.WriteLine(reader.ReadLine());
                }
            }
        }
    }
    

    Then change your ConsoleServerApp to a Winforms application so that it can display the notification whenever the windows service sends it a message:

        public Form1()
        {
            InitializeComponent();
    
            StartServer();
            Task.Delay(_threadJoinTimeout).Wait();
    
        }
    
        public void DisplayMessage()
        {
            this.notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
            this.notifyIcon1.BalloonTipText = "Welcomd!";
            this.notifyIcon1.BalloonTipTitle = "Title";
            this.notifyIcon1.ShowBalloonTip(2000);
        }
    
        void StartServer()
        {
            Task.Factory.StartNew(() =>
            {
                var server = new NamedPipeServerStream("PipesOfPiece");
                server.WaitForConnection();
                StreamReader reader = new StreamReader(server);
    
                while (true)
                {
                    var line = reader.ReadLine();
                    DisplayMessage();
                }
            });
        }
    

    Then put the ConsoleClientApp into your Windows Service.

    For details on the pipe please see Example of Named Pipes For the System Tray application please see http://www.tutorialspanel.com/create-system-tray-icon-windows-forms-application-using-c-vb-net/#:~:text=Below%20is%20an%20example%20of%20how%20to%20create,Step%203.%20Add%20an%20icon%20to%20the%20NotifyIcon Here are tips on using the TopShelf NuGet package which allows you to debug your Windows Service as a Console Application: https://www.codeproject.com/Articles/881511/SignalR-with-Self-hosted-Windows-Service

提交回复
热议问题