我有一个c#运行的应用程序,作为windows服务的控制插座连接和其他的东西。此外,还有另外一个窗户的形式应用程序的控制和配置这种服务(系统托盘带开始、停止,显示形式与构成参数)。

我使用。网远程处理的做IPC那是好的,但是现在我想展示一些真正的交通报告和其他报告和远程处理将不会满足我的性能要求。所以我想结合这两个应用程序中的一个。

这里的问题是:

当我开始的形式从windows服务,什么都没有发生。谷歌上搜索围绕我已经找到,我有权击的服务,转登上和检查"允许服务的互动式"选项。因为我不想问问我的用户做到这一点,我得到了一些代码谷歌上搜索再设置这个选项中的用户的regedit在安装期间的时间。问题是即使设置此选项,它不工作。我要打开记录上选择的服务(检查),取消,并再次检查。

因此,如何解决?怎么是最好的方式有一个windows服务系统托盘控制在相同的过程,可用于任何用户登录?

更新:谢谢你的意见迄今为止,伙计们。我同意这是更好地使用IPC我知道,它是坏的混合windows服务和用户接口。尽管,我想知道如何做到这一点。

有帮助吗?

解决方案

使用您选择的技术进行通信的两个独立流程。使用UI的服务是糟糕的主意。不要走这条路 - 你会后悔的。

我通过简单的套接字连接获得了很好的服务通信效果 - 很好地记录您的服务协议,尽可能保持简单,并且比您想象的要容易。

其他提示

在实践中,您不应将服务与管理UI结合使用。

我同意格雷格的观点。也许您可以检查一个不同的IPC机制。也许使用套接字和您自己的协议。或者,如果您的服务控制应用程序只能控制本地计算机上的服务,则可以使用命名管道(甚至更快)。

这是一种混合服务和表单的方式

http://www.codeproject.com/KB/system/SystemTrayIconInSvc.aspx

我想出了如何从这样做文章(单击方法表中的“更改”链接)。

string wmiPath = "Win32_Service.Name='" + SERVICE_NAME + "'";
using (ManagementObject service = new ManagementObject(wmiPath))
{
    object[] parameters = new object[11];
    parameters[5] = true;  // Enable desktop interaction
    service.InvokeMethod("Change", parameters);
}

我通过几个步骤获得解决方案,这是计划

  1. 我们不打算用Windows窗体创建服务项目,而是创建一个包含Windows服务项目,Windows窗体项目和安装项目的visual studio解决方案。

  2. 我们的想法是拥有一个数据库或文件或任何您喜欢存储数据的内容,您可以在其中存储Windows服务将始终用于运行的参数。因此,您的Windows服务和Windows窗体应用程序应该能够修改和检索数据。

  3. 在Windows应用程序的主窗体上拖放NotifyIcon在窗体上,在属性选项卡中,浏览并选择.ico图像(您可以在visual studio中创建一个但是这是另一个主题,你可以get google或者联系我)当你运行应用程序并且主表单处于活动状态或显示时,它将显示在系统托盘中,试一试,运行应用程序。

  4. 在解决方案的安装项目中将它们都添加为输出。要将项目添加到安装项目,它们必须位于同一解决方案中。右键单击解决方案资源管理器中的安装项目,突出显示添加,然后选择项目输出,添加Windows服务和Windows窗体输出,您将在安装项目下的解决方案资源管理器中看到它们。

  5. 添加一个Windows服务比这更进一步,但这也是google的另一个话题

  6. 创建Windows应用程序的快捷方式并将其添加到启动文件夹也是google的另一个主题或与我联系。

    注意编程表单时关闭按钮不显示且表单变为Me.visible = false并双击系统托盘中的图标是设置me.visible = true.that的唯一方法在计算机启动的任何时候,你的Windows窗体应用程序也会启动,并且可见会立即设置为false,但由于它有一个带有图标图像的notifyicon,它将显示在系统托盘中并双击它使表单可见以编辑您为服务存储的设置,该服务也会自动启动,因为您可以在设置项目中设置服务时进行设置。 我的邮件是iamjavademon@gmail.com使用屏幕截图更好地说明并完整解释

非常简单 - 您需要创建一个线程来执行应用程序事件。 像这样(带有CLR的C ++源代码,但你可以在C#中做到这一点):

ref class RunWindow{
public:
    static void MakeWindow(Object^ data)
    {
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        Application::Run(gcnew TMainForm());
    };
};

在主

中创建线程
int main(array<System::String ^> ^args)
{
    bool bService = RunAsService(L"SimpleServiceWithIconInTrayAndWindow");

    if (bService)
    {

        System::Threading::Thread ^thread = gcnew System::Threading::Thread(gcnew ParameterizedThreadStart(RunWindow::MakeWindow));
        thread->Start();

        ServiceBase::Run(gcnew simpleWinService());
        Application::Exit();
    }
    else
    {
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        // Create the main window and run it
        Application::Run(gcnew TMainForm());
    }

    return 0;
}

主要问题的交互式服务是:

  • 安全的其他过程可能发送信息,通过其信息泵,从而获得一个系统/地方进程。

  • 不完整-一个交互式服务,从来没有看到壳的消息,因此不能互通知的区域的图标。

我们定期使用TCP and UDP connections传递的信息服务,其他的前任,并且,在某些情况下,内容.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top