c# - 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();
}
}
}
解决方案
http://securityinternals.blogspot.com/2014/02/windows-session-0-isolation.html
您可以阅读文章中的详细信息,但只要说 Windows 服务无法再与普通用户的桌面交互就足够了。我的猜测是您的表单实际上是在会话 0 中打开的,这不是您通常能够查看或与之交互的内容。
为了解决这个问题,这是我的项目所做的。
我们创建了一个 Windows 服务,它公开了一些与之通信的机制。在我们的例子中,Windows 服务最初使用套接字和管道公开了一个基于 WCF 的接口。由于开销的原因,我们最终转移到了 localhost 上的 TCP 套接字,而今天我们使用的是共享内存。就本次讨论的目的而言,该机制并不重要。您的服务只需为用户运行的应用程序提供某种连接、通信和断开连接的方式。
完成此操作后,您可以构建一个应用程序,该应用程序提供用于与服务通信的 UI。我们已经做到了这一点,并允许将应用程序最小化到系统托盘中,以使其看起来像是一个幕后的东西。系统托盘图标然后提供一个弹出菜单,允许用户直接向服务发送命令或打开应用程序以获得附加功能。
高温高压
推荐阅读
- android - 在 Cloud-Foundry 上部署本机安卓应用 (apk)
- json - 如何使用搜索栏过滤 json 数据
- combinations - 术语:这是组合、排列还是其他?
- python - ImportError:没有名为“tensorflow.contrib.lite.python.tflite_convert”的模块
- scala - 如何使用 sbt 为 scala spark 导入 crossValidatorModel
- javascript - 首次安装 Chrome 扩展后,使用私有企业 chrome 应用程序扩展中的 .crx 文件打开“设置”页面
- angular - 通过 *ngFor 在数组中显示对象
- c# - Neo4j 与实体框架
- angular - 如何在模型中使用子组件在 Angular 6 中打开另一个组件?
- android - 在三星 note 8 上安装 apk 时出现“包解析错误”