C# мое приложение запускается в диспетчере задач, но не отображается на рабочем столе - PullRequest
0 голосов
/ 21 февраля 2020

Я создал сервис windows с Top Shelf. Эта служба проверяет уровень заряда батареи и, когда батарея успешно заряжена (80%), открывает любую форму или приложение UI Windows, чтобы уведомить меня об этом (в этом примере открывается .txt). Когда я тестирую его в Visual Studio, он работает отлично, поэтому мой пользовательский интерфейс или любое другое приложение как в диспетчере задач, так и на рабочем столе, но когда я устанавливаю его как службу, пользовательский интерфейс или любое приложение появляется только в диспетчере задач, а не на рабочем столе здесь это код:

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();
    }
}

}

1 Ответ

0 голосов
/ 25 февраля 2020

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

Вы можете прочитать подробности в статье, но достаточно сказать, что службы Windows больше не могут взаимодействовать с рабочим столом обычных пользователей. Я предполагаю, что ваша форма фактически открывается в сеансе 0, который вы обычно не можете просматривать или взаимодействовать.

Чтобы обойти эту проблему, вот что сделал мой проект.

Мы создали сервис Windows, который предоставляет некоторый механизм для связи с ним. В нашем случае сервис Windows изначально предоставлял интерфейс на основе WCF, используя как сокеты, так и каналы. Из-за накладных расходов мы в конечном итоге перешли на сокет TCP через localhost, и сегодня мы используем разделяемую память. Механизм не имеет значения для целей этого обсуждения. Ваша служба просто должна предоставить приложению, запускаемому пользователем, способ подключения, связи и отключения.

Как только это будет сделано, вы можете создать приложение, предоставляющее пользовательский интерфейс для связи со службой. Мы сделали это и позволили свернуть приложение в системный трей, чтобы создать впечатление, что это закулисная вещь. Затем на панели задач появляется значок всплывающего меню, которое позволяет пользователю отправлять команды непосредственно службе или открывать приложение для дополнительных функций.

HTH

...