C# 我的应用程序在任务管理器中启动但未显示在桌面中
C# my application starts in task manager but not shown in Desktop
我用 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 的接口。由于开销,我们最终转移到本地主机上的 TCP 套接字,今天我们使用共享内存。就本次讨论而言,该机制并不重要。您的服务只需为用户 运行 应用程序提供某种连接、通信和断开连接的方式。
一旦就绪,您就可以构建一个提供 UI 用于与服务通信的应用程序。我们已经做到了这一点,并允许将应用程序最小化到系统托盘,以提供它是幕后事物的外观。系统托盘图标然后提供一个弹出菜单,允许用户直接向服务发送命令或打开应用程序以获得其他功能。
HTH
我用 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 的接口。由于开销,我们最终转移到本地主机上的 TCP 套接字,今天我们使用共享内存。就本次讨论而言,该机制并不重要。您的服务只需为用户 运行 应用程序提供某种连接、通信和断开连接的方式。
一旦就绪,您就可以构建一个提供 UI 用于与服务通信的应用程序。我们已经做到了这一点,并允许将应用程序最小化到系统托盘,以提供它是幕后事物的外观。系统托盘图标然后提供一个弹出菜单,允许用户直接向服务发送命令或打开应用程序以获得其他功能。
HTH