Служба Windows: OnPowerEvent не запускается - PullRequest
2 голосов
/ 02 октября 2010

Я хочу создать службу Windows, которая отслеживает, подключен ли адаптер питания кондиционера или нет.Для этого я пытаюсь собрать службу Windows следующим образом:

using System;
using System.ServiceProcess;

namespace PowerAlert {
    partial class PowerAlert : ServiceBase {
        public PowerAlert() {
            InitializeComponent();
        }

        protected override void OnStart(string[] args) {
            base.OnStart(args);
        }

        protected override void OnStop() {
            base.OnStop();
        }

        protected new virtual void OnPowerEvent(PowerBroadcastStatus powerStatus) {
            Console.Beep();
        }
    }
}

После установки службы и ее запуска из services.msc, когда я отключаю адаптер и снова подключаю его, я не слышузвуковой сигнал.

Я уверен, что не правильно что-то (ы) .Не могли бы вы помочь мне определить, что / те что-то (ы)?

РЕДАКТИРОВАТЬ 1

Как вы можете видеть ниже, CanHandlePowerEvent установленв true.

namespace PowerAlert {
    partial class PowerAlert {
        /// <summary> 
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing) {
            if (disposing && (components != null)) {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary> 
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent() {
            // 
            // PowerAlert
            // 
            this.CanHandlePowerEvent = true;
            this.ServiceName = "PowerAlert";
        }

        #endregion
    }
}

Я переопределил OnPowerEvent, как показано ниже:

using System;
using System.ServiceProcess;

namespace PowerAlert{
    partial class PowerAlert: ServiceBase {
        public PowerAlert() {
            InitializeComponent();
        }

        protected override void OnStart(string[] args) {
            base.OnStart(args);
        }

        protected override void OnStop() {
            base.OnStop();
        }

        protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus) {
            Console.Beep();

            return base.OnPowerEvent(powerStatus);
        }
    }
}

Тем не менее, я не слышу никаких звуковых сигналов.

Ответы [ 2 ]

7 голосов
/ 02 октября 2010

Помимо неправильного синтаксиса для переопределения метода, похоже, что вы не настроили свойство CanHandlePowerEvent .

Когда состояние питания компьютера изменения, диспетчер управления службами (SCM) проверяет, является ли служба принимает команды события питания, используя значение CanHandlePowerEvent.

Если CanHandlePowerEvent имеет значение true, Команда передается в службу и метод OnPowerEvent вызывается, если определены. Если OnPowerEvent нет реализован в производном классе, SCM обрабатывает энергетическое событие через пустой базовый класс ServiceBase.OnPowerEvent method.ServiceBase.OnPowerEvent method.

И, пожалуйста, одна вещь о методе:

Метод Beep не поддерживается в 64-разрядных выпусках Windows Vista и Windows XP.

4 голосов
/ 02 октября 2010
    protected new virtual void OnPowerEvent(PowerBroadcastStatus powerStatus) {
        Console.Beep();
    }

Проверьте свою любимую книгу по программированию на C # с ключевым словом new . Краткая версия: он скрывает базовый метод, но не переопределяет его. И таким образом это никогда не будет называться. Удалите новый виртуальный, используйте переопределение, так же, как вы сделали для других методов. Вам также нужно будет установить для свойства CanHandlePowerEvent значение true в конструкторе.

...