2

我有一个简单的应用程序,可以监视文件夹中的任何更改,如下所示:

            private void Form1_Load(object sender, EventArgs e)

>         {
>             FileSystemWatcher w = new FileSystemWatcher();
>             w.Path = @"C:\temp";
>             w.Changed += new FileSystemEventHandler(OnChanged);
>             w.Created += new FileSystemEventHandler(OnChanged);
>             w.Deleted += new FileSystemEventHandler(OnChanged);
>             w.Renamed += new RenamedEventHandler(OnChanged);
>             // Begin watching.
>             w.EnableRaisingEvents = true;
        }
    // Define the event handlers. 
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
        MessageBox.Show("File: " + e.FullPath + " " + e.ChangeType + Path.GetFileName(e.FullPath));
    }

我从命令提示符添加了与服务相同的内容

  sc create <service name> binPath= <path of the exe file>

这在服务中添加了 exe,并在注册表中添加了条目。但是当我尝试启动服务时

sc start <service name>

它显示了“交互式服务检测”消息。

我想避免此消息弹出并启动服务。我也需要在 c# 中完成此操作,但如果有人对在 cmd 中执行此操作有任何想法,我可以将其添加为批处理文件并执行相同操作。

编辑我

正如@Seva 建议的那样,我创建了一个调用我希望的 exe 的服务。我编写了以下代码以在服务启动时启动 exe:

    protected override void OnStart(string[] args)
    {

        base.OnStart(args);
        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerAsync();

    }
    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        p.StartInfo.CreateNoWindow = false;
        p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
        p.StartInfo.WorkingDirectory = @"<my exe path>";
        p.StartInfo.FileName = "<myexe.exe>";
        p.StartInfo.Arguments = @"<my exe path>";
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.Start();
        p.WaitForExit();
        base.Stop();
    }

我成功安装了服务,但在启动时没有启动 exe。

编辑二

exe启动。必须将服务的属性配置为允许服务与桌面交互,但随后又出现“交互服务检测”消息。

4

1 回答 1

2

您必须将 Windows 服务重新架构为两部分——一个无 GUI 的服务进程和一个在用户桌面上运行的单独的 UI 应用程序。服务可以通过多种方式与 UI 应用程序进行通信。这些 SO 问题将帮助您入门:

没有其他办法。顺便说一句,您现有的方法已经被打破了——对于非管理员用户和远程桌面会话——即使他们愿意,他们也不会看到来自服务的 UI。

于 2013-01-17T20:29:06.083 回答