Подтвердить что ты не робот

Значок уведомления для службы окон

Я разработал программу обслуживания win, которая считывает файл excel с моего локального диска, а затем сохраняет эти значения файла в базе данных, и теперь я хочу разработать значок уведомления, который будет отображаться для отображения сообщения ( "Файл Excel, сохраненный в базе данных" ) после того, как моя служба запустится и сохранит файл excel в базе данных.

Пожалуйста, дайте мне несколько советов, чтобы решить эту проблему.

4b9b3361

Ответ 1

Начиная с Vista, вашей службе не разрешается взаимодействовать с рабочим столом, поэтому не может быть запущен пользовательский интерфейс непосредственно из службы. Вам нужно создать приложение-агент, которое запускается при входе пользователя, который может общаться с вашим сервисом, возможно, используя WCF.

Здесь MS должен сказать об этом:

Для более сложных взаимодействий разработчики должны перенести свой код пользовательского интерфейса на агента, который запускается в сеансе пользователей и обрабатывает все требования пользовательского интерфейса. Агент связывается со службой через RPC или именованные каналы. Если пользователь инициирует взаимодействие пользовательского интерфейса с помощью панели управления, Internet Explorer или аналогичного опыта пользовательского интерфейса, этот опыт пользовательского интерфейса должен запускать агент. Затем агент обрабатывает все пользовательские интерфейсы. Если пользовательский интерфейс требуется, но не инициирован пользователем, служба должна запросить у агента запуск любого требуемого пользовательского интерфейса, вместо того, чтобы пытаться запустить этот интерфейс самостоятельно. В редкой ситуации, когда служба должна инициировать взаимодействие с пользователем, а агент еще не запущен, служба должна вызвать API-интерфейс CreateProcessAsUser для запуска агента. Затем агент может инициировать все взаимодействия с пользовательским интерфейсом. Важно, чтобы разработчики тщательно рассмотрели все возможные сценарии использования и рассмотрели возможность переноса всего кода пользовательского интерфейса в агент, который запускается в сеансе пользователя.

Ответ 2

Проблема заключается в том, что служба Windows работает в фоновом режиме и не влияет на рабочий стол пользователя.

Вы можете создать приложение, подобное этому (без формы окна): Уведомлять значок в .Net 2.0

И затем используйте в приложении что-то вроде следующего класса для связи с службой Windows:

public class Program
{
    public int Setting { get; set; }
}

[ServiceContract]
public interface ISettingService
{
    [OperationContract]
    void SetSetting(int setting);
}

public class SettingService : ISettingService
{
    private readonly Program program;

    public SettingService(Program program)
    {
        this.program = program;
    }

    public void SetSetting(int setting)
    {
        program.Setting = setting;
    }
}

internal class CustomInstanceProvider : IInstanceProvider
{
    private readonly Program program;

    public CustomInstanceProvider(Program program)
    {
        this.program = program;
    }

    public object GetInstance(InstanceContext instanceContext, Message message)
    {
        return GetInstance(instanceContext);
    }

    public object GetInstance(InstanceContext instanceContext)
    {
        return new SettingService(program);
    }

    public void ReleaseInstance(InstanceContext instanceContext, object instance)
    {
        IDisposable disposable = instance as IDisposable;
        if (disposable != null)
        {
            disposable.Dispose();
        }
    }
}

internal class CustomInstanceProviderBehaviorAttribute : Attribute, IServiceBehavior
{
    private readonly IInstanceProvider instanceProvider;

    public CustomInstanceProviderBehaviorAttribute(IInstanceProvider instanceProvider)
    {
        this.instanceProvider = instanceProvider;
    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
        {
            foreach (EndpointDispatcher ed in cd.Endpoints)
            {
                if (!ed.IsSystemEndpoint)
                {
                    ed.DispatchRuntime.InstanceProvider = instanceProvider;
                }
            }
        }
    }

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { }
    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }
}

public class CustomServiceHost : ServiceHost
{
    private readonly Program p;

    public CustomServiceHost(Program program, params Uri[] baseAddresses)
    : base(typeof(SettingService), baseAddresses)
    {
        this.p = program;
    }

    protected override void OnOpening()
    {
        Description.Behaviors.Add(new CustomInstanceProviderBehaviorAttribute(new CustomInstanceProvider(p)));
        base.OnOpening();
    }
}

Ответ 3

Мне кажется, вам нужен NotifyIcon.ShowBalloonTip метод для реализации в вашем сервисе. Возможно, вам потребуется прочитать this.