我熟悉编写Windows Service应用程序。我已经使用多种方法编写了一些文件-第三方库,.NET提供的方法等。不过,我以前的服务应用程序都没有与之交互的方法。
我现在需要编写一个Windows Service应用程序,但是它将需要一个任务栏图标,当您单击它时,它可能会显示一个“管理GUI”。
什么是合适的模式?
该服务应该是其自己的应用程序,但能够通过外部方式与之交互-也许是一个轮询配置更改的数据库?应该使用IPC还是什么?
有没有办法使Windows服务也具有GUI,以便管理GUI和服务都只是同一应用程序?
答案 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应用程序。