我用Top创建了一个windows服务。此服务测试电池级别,当电池成功充电(80%)时,它将打开任何UI窗体或应用程序,以便对此进行说明(在本例中,它将打开.txt)。当我在Visual中测试它时,我的UI或任何应用程序apperas都是在任务管理器和桌面中测试的,但是当我将其安装为服务时,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();
}
}}
发布于 2020-02-24 22:34:52
http://securityinternals.blogspot.com/2014/02/windows-session-0-isolation.html
您可以阅读本文中的详细信息,但只需说Windows服务不能与普通用户的桌面进行交互就足够了。我猜您的表单实际上是在会话0中打开的,这不是您通常能够查看或与之交互的东西。
为了解决这个问题,下面是我的项目所做的。
我们已经创建了一个Windows服务,它公开了一些用于与其通信的机制。在我们的示例中,Windows服务最初使用套接字和管道公开了一个基于WCF的接口。由于开销的原因,我们最终通过本地主机转移到TCP套接字,今天我们使用的是共享内存。就这次讨论而言,这种机制并不重要。您的服务只需为用户运行的应用程序提供某种方式来连接、通信和断开连接。
一旦设置好了,您就可以构建一个应用程序,该应用程序提供了一个用于与服务通信的UI。我们已经这样做了,并允许将应用程序最小化到系统托盘,以使其看起来像是幕后的事情。然后,系统托盘图标提供了一个弹出式菜单,允许用户直接向服务发送命令或打开应用程序以获得其他功能。
HTH
https://stackoverflow.com/questions/60336332
复制相似问题