Как использовать ManagementEventWatcher для отслеживания приостановки / возобновления? - PullRequest
9 голосов
/ 28 января 2010

Я пытаюсь использовать ManagementEventWatcher в сервисе, чтобы отслеживать, когда компьютер входит и выходит из спящего режима.Я новичок в .NET и C #, поэтому я изо всех сил пытаюсь придумать синтаксис, чтобы сделать эту работу.

Я нашел сообщение в блоге , в котором подробно описано, как он использовал ManagementEventWatcher для отслеживания этого состояния, но он не опубликовал весь свой код.Я пытаюсь пройти и создать простой сервис, который создает файл журнала .txt, сообщающий, что компьютер был приостановлен / возобновлен, но у меня возникают проблемы с пространствами имен и типами.

Вот код файла service.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Management;

namespace SleepNotifierService
{
    public class WqlEventQuery : EventQuery { }

    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {


            WqlEventQuery query = new WqlEventQuery("Win32_PowerManagementEvent");
            _watcher = new ManagementEventWatcher(query);
            _watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
            _watcher.Start();
        }

        protected override void OnStop()
        {
            _watcher.Stop();
        }

        void watcher_EventArrived(object sender, EventArrivedEventArgs e)
        {
            try
            {
                int eventType = Convert.ToInt32(e.NewEvent.Properties["EventType"].Value);
                switch (eventType)
                {
                    case 4:
                        Sleep();
                        break;
                    case 7:
                        Resume();
                        break;
                }
            }
            catch (Exception ex)
            {
                //Log(ex.Message);
            }
        }

        public void Sleep()
        {
        }

        public void Resume()
        {
        }

    }
}

Опять же, я впервые программирую на .NET и C #, поэтому я прошу прощения за свое невежество.

Я получаю ошибки пространства имен, такие как:

Не удалось найти имя типа или пространства имен 'ManagementEventWatcher' (отсутствует директива using или ссылка на сборку?)

Спасибо,

Томек

1 Ответ

7 голосов
/ 28 января 2010

Вам необходимо пространство имен System.Management, которое включено в предоставленный вами пример кода. Я считаю, что вам нужно обратиться к библиотеке System.Management в настройках вашего проекта. Для этого выполните следующие действия (я предполагаю, что вы подаете в суд на Visual Studio):

Перейдите в обозреватель решений и разверните проект, щелкните правой кнопкой мыши папку / параметр «Ссылки» и выберите «Добавить ссылки» в контекстном меню. Теперь выберите вкладку .Net, выберите System.Management из списка и нажмите кнопку «ОК».

...