如何在登录前在Windows启动时运行应用程序.exe?(登录前执行WinForm,登录后显示Interact = Show GUI执行的表单)



我的windows服务器2008 VPS中有一个winform应用程序(.exe文件)
此应用程序应每5分钟从互联网上获取一些数据,并将其保存到文本文件中
我的VPS在2或3天后无故重新启动
我想强制我的服务器在启动时运行该应用程序&在每次重新启动时执行它
为此,我遵循了以下说明:

这很简单。过程是。

  1. 运行gpedit.msc
  2. 转到计算机配置->Windows设置->脚本(启动/关闭)
  3. 转到"启动"属性,然后您将获得新窗口
  4. 现在添加登录前要运行的程序

问题是文件在启动时执行,但登录到windows后,我看不到它的表单正在运行
我可以看到应用程序正在任务管理器中运行
登录windows后,如何查看winform?(我需要GUI)
我的意思是,我的应用程序甚至在登录之前就必须运行,并且它应该位于系统托盘上;显示";用于交互的接口
如果登录后在c#编程中有显示该应用程序的方法,请分享。

您需要将应用程序的服务与UI分离。

  • 该服务可以是Windows服务或在启动前运行的控制台应用程序
  • 用户界面可以是在用户登录后运行的Windows窗体应用程序
  • 要在服务和windows应用程序之间进行通信,可以使用IPC解决方案,如自托管WCF或自托管Web API

GUI应用程序+Windows服务+安装程序中托管的WCF服务

在这里,我将分享一个循序渐进的例子,包括:

  • Windows服务
  • Windows服务中托管的WCF服务
  • 调用WCF服务方法的WinForms应用程序
  • 安装程序,用于安装windows服务和WinForms应用程序,并启动该应用程序

因此,安装后,服务将在windows启动中启动。GUI应用程序也将在用户登录应用程序时启动。然后,如果你点击一个按钮,它会显示一条来自服务的消息。

克隆或下载:

  • r-aghaei/SampleUIandService
  • 下载master.zip

服务层项目

  1. 创建类库项目(ServiceLayer)

  2. 将新的WCF服务添加到类库中。(MyWCFService)

  3. 修改合同:

    [ServiceContract]
    public interface IMyWCFService
    {
    [OperationContract]
    string Echo(string message);
    }
    
  4. 修改MyWCFService:的实现

    public class MyWCFService : IMyWCFService
    {
    public string Echo(string message)
    {
    return message;
    }
    }
    
  5. 添加Windows服务。(MyWindowsService)

  6. 修改服务的实现:

    partial class MyWindowsService : ServiceBase
    {
    ServiceHost host;
    public MyWindowsService()
    {
    InitializeComponent();
    }
    protected override void OnStart(string[] args)
    {
    host = new ServiceHost(typeof(MyWCFService));
    host.Open();
    }
    protected override void OnStop()
    {
    host.Close();
    }
    }
    
  7. 双击MyWindowsService,然后右键单击表面并选择添加安装程序

  8. 双击ProjectInstaller.cs,从组件列表中选择serviceInstaller1,然后在属性窗口中,将StartType设置为automatic。

  9. 选择serviceProcessInstaller1,然后在属性窗口中,将"帐户"设置为LocalSystem。

  10. 添加一个C#文件。(Program.cs)

  11. 将Program.cs类的内容修改为:

    static class Program
    {
    static void Main()
    {
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
    {
    new MyWindowsService()
    };
    ServiceBase.Run(ServicesToRun);
    }   
    }
    

UILayer项目

  1. 创建Windows窗体应用程序(UILayer)

  2. 添加对MyServiceLayer项目的引用

  3. 在设计模式下打开Form1,在其上放置一个按钮并双击以处理其点击事件,并使用以下代码:

    private void button1_Click(object sender, EventArgs e)
    {
    ChannelFactory<IMyWCFService> factory = 
    new ChannelFactory<IMyWCFService>("BasicHttpBinding_IMyWCFService");
    IMyWCFService proxy = factory.CreateChannel();
    MessageBox.Show(proxy.Echo("Hello!"));
    }
    
  4. 修改app.config文件以包括WCF配置:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    </startup>
    <system.serviceModel>
    <bindings>
    <basicHttpBinding>
    <binding name="BasicHttpBinding_IMyWCFService" />
    </basicHttpBinding>
    </bindings>
    <client>
    <endpoint address="http://localhost:8733/Design_Time_Addresses/ServiceLayer/MyWCFService/"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyWCFService"
    contract="ServiceLayer.IMyWCFService" name="BasicHttpBinding_IMyWCFService" />
    </client>
    </system.serviceModel>
    </configuration>
    
  5. 确保UILayer的app.config中的endpoint addressServiceLayer的app.configbaseAddress相同。

设置项目

  1. 创建一个安装项目
  2. 右键单击项目,然后从"添加"菜单中选择"项目输出"。然后添加ServiceLayer的主要输出。(从下拉列表中选择项目)
  3. 右键单击项目,然后从"添加"菜单中选择"项目输出"。然后添加UILayer的主要输出
  4. 右键单击"设置"项目,然后选择"查看自定义操作">
  5. 在自定义操作窗口中,对于所有节点(安装、提交、回滚、卸载),右键单击并选择添加自定义操作,然后从应用程序文件夹中选择ServiceLayer的主输出
  6. 右键单击安装项目并选择"查看文件系统">
  7. 右键单击根节点,选择"添加特殊文件夹",然后选择"用户的启动文件夹">
  8. 选择启动文件夹,然后在右窗格中,右键单击并选择创建快捷方式,然后从应用程序文件夹中选择UILayer的主要输出
  9. 重新生成解决方案和安装项目
  10. 通过转到安装程序的输出文件夹或右键单击安装程序项目并选择安装来安装安装程序

安装完成后,您可能需要重新启动系统以查看效果。该服务将自动启动,用户登录后将显示UILayer。

点击按钮,它会显示一个MessageBox,上面写着Hello!此内容来自服务。

相关内容

最新更新