如何制作带有任务栏图标进行管理的Windows服务?

时间:2019-02-05 18:08:11

标签: c# windows

我熟悉编写Windows Service应用程序。我已经使用多种方法编写了一些文件-第三方库,.NET提供的方法等。不过,我以前的服务应用程序都没有与之交互的方法。

我现在需要编写一个Windows Service应用程序,但是它将需要一个任务栏图标,当您单击它时,它可能会显示一个“管理GUI”。

什么是合适的模式?

该服务应该是其自己的应用程序,但能够通过外部方式与之交互-也许是一个轮询配置更改的数据库?应该使用IPC还是什么?

有没有办法使Windows服务也具有GUI,以便管理GUI和服务都只是同一应用程序?

2 个答案:

答案 0 :(得分:3)

  

有没有办法使Windows服务也具有GUI

否; Windows服务根据定义没有(交互式)桌面。指出要使其正常工作的任何事情,充其量都是非常肮脏的。

  

有没有办法使Windows服务也具有GUI,以便管理GUI和服务都只是同一应用程序?

您可以通过将常见内容放入库或其他内容中来共享代码。您甚至可以共享整个代码库,并使用--service命令行参数(例如)和不带(或带有--gui)参数的GUI部分来运行应用程序。

  

通过外部方式进行交互-也许是它轮询配置更改的数据库?

这是可能的,但不是最快或最有效的

  

它应该使用IPC还是什么?

我会选择的。您可以使用任何您想要的东西。 REST API,WCF,TCP / UDP连接,套接字,(命名的)管道,内存映射的I / O ...无论您选择什么,都是IPC的一种。您甚至可以将custom commands发送到您的服务,但这非常非常有限。

如果由我决定,我可以使用WCF来实现。但是我有点偏见,我做了很多WCF事情。

答案 1 :(得分:1)

摘要

是的,您的Windows服务可以具有GUI。但是,该GUI必须是一个单独的项目(例如Windows Forms项目)。仅仅是Windows Forms项目和Windows服务项目必须使用数据库,API(例如WCF),库等之间的通用属性。通常,您将在Windows服务内部执行必要的功能并更新状态/ Windows窗体应用程序中的设置。

将GUI以及快捷菜单添加到任务栏

在Windows窗体应用程序的 Main 方法中,创建 NotifyIcon 类的对象。您还可以创建 ContextMenu 对象,并将其分配给 NotifyIcon 对象的 ContextMenu 属性,以允许任务栏图标具有快捷菜单。这是一个示例:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    using (var icon = new NotifyIcon())
    {
        icon.Icon = System.Drawing.Icon.ExtractAssociatedIcon(Application.ExecutablePath);

        var contextMenu = new ContextMenu();
        var mnuProperties = new MenuItem()
        {
            Text = "Properties"
        };
        var mnuQuit = new MenuItem()
        {
            Text = "Quit"
        };

        mnuProperties.Click += mnuProperties_Click;
        mnuQuit.Click += mnuQuit_Click;

        contextMenu.MenuItems.Add(mnuProperties);
        contextMenu.MenuItems.Add(mnuQuit);

        icon.ContextMenu = contextMenu;
        icon.Visible = true;

        Application.Run();
    }
}

private static void mnuQuit_Click(object sender, EventArgs e)
{
    Application.Exit();
}

private static void mnuProperties_Click(object sender, EventArgs e)
{
    var propertiesForm = new PropertiesForm();
    propertiesForm.Show();
}

不用说,您可以在上下文菜单中添加尽可能多的菜单项,添加表格等。

最后一点,不必一定是Windows Forms应用程序。相反,它很可能是WPF应用程序。