首页 > 解决方案 > C# 我的应用程序在任务管理器中启动但未显示在桌面中

问题描述

我用 Top Shelf 创建了一个 Windows 服务。此服务测试电池电量,当电池成功充电(80%)时,它会打开任何 UI Windows 窗体或应用程序来通知我(在本例中,它会打开 .txt)。当我在 Visual Studio 中对其进行测试时,它可以完美运行,因此我的 UI 或任何应用程序都出现在任务管理器和桌面中,但是当我将其安装为服务时,UI 或任何应用程序仅出现在任务管理器中而不是桌面中,代码如下:

using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Timers;
using System.Windows.Forms;

namespace SimpleHeartBeatService
{
    public class Heartbeat
    {
    private readonly System.Timers.Timer _timer; //referance yaratdiq
    private static bool firstChecker = true;
    private static bool secondChecker = true;
    public Heartbeat()
      {
      _timer = new System.Timers.Timer(1000) //referanca objecr menimsetdik 
        {
            AutoReset = true  //Object initializer (kitabda Constr deeper de en axirda var)
        };

        _timer.Elapsed += TimerElapsed;
    }

    private void TimerElapsed(object sender, ElapsedEventArgs e)
    {  //Bize lazim olan hisse burdan asagidadir

        PowerStatus status = SystemInformation.PowerStatus;
        if (status.PowerLineStatus.ToString() == "Online" && secondChecker)
        {
            firstChecker = true;
            secondChecker = false;
        }

        if (firstChecker && status.PowerLineStatus.ToString() == "Online" && 
                                                               status.BatteryLifePercent * 100 > 80)
        {
            Process.Start(@"C:\Users\qarib\Desktop\Test\batteryLevel.txt");


            firstChecker = false;
        }

        if (status.PowerLineStatus.ToString() == "Offline")
        {
            secondChecker = true;
        }
        // code here
        Thread.Sleep(500);
    }

    public void Start() //Bunlar mutleq yazilmalidir
    {
        _timer.Start();
    }

    public void Stop() //Bunlar mutleq yazilmalidir
    {
        _timer.Stop();
    }
}

}

标签: c#windowsservicewindows-services

解决方案


http://securityinternals.blogspot.com/2014/02/windows-session-0-isolation.html

您可以阅读文章中的详细信息,但只要说 Windows 服务无法再与普通用户的桌面交互就足够了。我的猜测是您的表单实际上是在会话 0 中打开的,这不是您通常能够查看或与之交互的内容。

为了解决这个问题,这是我的项目所做的。

我们创建了一个 Windows 服务,它公开了一些与之通信的机制。在我们的例子中,Windows 服务最初使用套接字和管道公开了一个基于 WCF 的接口。由于开销的原因,我们最终转移到了 localhost 上的 TCP 套接字,而今天我们使用的是共享内存。就本次讨论的目的而言,该机制并不重要。您的服务只需为用户运行的应用程序提供某种连接、通信和断开连接的方式。

完成此操作后,您可以构建一个应用程序,该应用程序提供用于与服务通信的 UI。我们已经做到了这一点,并允许将应用程序最小化到系统托盘中,以使其看起来像是一个幕后的东西。系统托盘图标然后提供一个弹出菜单,允许用户直接向服务发送命令或打开应用程序以获得附加功能。

高温高压


推荐阅读