Condividi tramite


SystemEvents Classe

Definizione

Fornisce l'accesso alle notifiche degli eventi di sistema. La classe non può essere ereditata.

public ref class SystemEvents sealed
public sealed class SystemEvents
type SystemEvents = class
Public NotInheritable Class SystemEvents
Ereditarietà
SystemEvents

Esempio

Questa sezione contiene due esempi. Il primo esempio mostra come usare gli eventi di sistema in un'applicazione normale e il secondo esempio illustra come usare gli eventi di sistema in un servizio Windows.

Esempio 1

L'esempio di codice seguente registra l'interesse per alcuni eventi di sistema e attende che si verifichi uno di questi eventi. L'output visualizzato si verifica se l'utente modifica la risoluzione di visualizzazione.

#using <System.dll>

using namespace System;
using namespace Microsoft::Win32;

// This method is called when a user preference changes.
void SystemEvents_UserPreferenceChanging(Object^ sender,
     UserPreferenceChangingEventArgs^ e)
 {
     Console::WriteLine("The user preference is changing. Category={0}",
         e->Category);
 }

// This method is called when the palette changes.
void SystemEvents_PaletteChanged(Object^ sender, EventArgs^ e)
{
    Console::WriteLine("The palette changed.");
}

// This method is called when the display settings change.
void SystemEvents_DisplaySettingsChanged(Object^ sender,
    EventArgs^ e)
{
    Console::WriteLine("The display settings changed.");
}

int main()
{
    // Set the SystemEvents class to receive event notification
    // when a user preference changes, the palette changes, or
    // when display settings change.
    SystemEvents::UserPreferenceChanging += gcnew
        UserPreferenceChangingEventHandler(
        SystemEvents_UserPreferenceChanging);
    SystemEvents::PaletteChanged += gcnew
        EventHandler(SystemEvents_PaletteChanged);
    SystemEvents::DisplaySettingsChanged += gcnew
        EventHandler(SystemEvents_DisplaySettingsChanged);

    // For demonstration purposes, this application sits idle
    // waiting for events.
    Console::WriteLine("This application is waiting for system events.");
    Console::WriteLine("Press <Enter> to terminate this application.");
    Console::ReadLine();
}

// This code produces the following output.
//
//  This app is waiting for system events.
//  Press <Enter> to terminate this application.
//  Display Settings changed.
//  User preference is changing. Category=General
using System;
using Microsoft.Win32;

public sealed class App 
{
    static void Main() 
    {         
        // Set the SystemEvents class to receive event notification when a user 
        // preference changes, the palette changes, or when display settings change.
        SystemEvents.UserPreferenceChanging += new 
            UserPreferenceChangingEventHandler(SystemEvents_UserPreferenceChanging);
        SystemEvents.PaletteChanged += new 
            EventHandler(SystemEvents_PaletteChanged);
        SystemEvents.DisplaySettingsChanged += new 
            EventHandler(SystemEvents_DisplaySettingsChanged);        

        // For demonstration purposes, this application sits idle waiting for events.
        Console.WriteLine("This application is waiting for system events.");
        Console.WriteLine("Press <Enter> to terminate this application.");
        Console.ReadLine();
    }

    // This method is called when a user preference changes.
    static void SystemEvents_UserPreferenceChanging(object sender, UserPreferenceChangingEventArgs e) 
    {
        Console.WriteLine("The user preference is changing. Category={0}", e.Category);
    }

    // This method is called when the palette changes.
    static void SystemEvents_PaletteChanged(object sender, EventArgs e)
    {
        Console.WriteLine("The palette changed.");
    }

    // This method is called when the display settings change.
    static void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e)
    {
        Console.WriteLine("The display settings changed.");
    }
}

// This code produces the following output.
// 
//  This app is waiting for system events.
//  Press <Enter> to terminate this application.
//  Display Settings changed.
//  User preference is changing. Category=General
Imports Microsoft.Win32
Imports System.Windows.Forms

Friend Class Form1
    Inherits System.Windows.Forms.Form


    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Set the SystemEvents class to receive event notification 
        'when a user preference changes, the palette changes, or 
        'when display settings change.
        AddHandler SystemEvents.UserPreferenceChanging, _
        AddressOf SystemEvents_UserPreferenceChanging

        AddHandler SystemEvents.PaletteChanged, _
        AddressOf SystemEvents_PaletteChanged

        AddHandler SystemEvents.DisplaySettingsChanged, _
        AddressOf SystemEvents_DisplaySettingsChanged

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If (components IsNot Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub


    Private components As System.ComponentModel.IContainer

    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

        Me.SuspendLayout()

        '
        'Form1
        '
        Me.ClientSize = New System.Drawing.Size(648, 398)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub


    ' This method is called when a user preference changes.
    Private Sub SystemEvents_UserPreferenceChanging( _
    ByVal sender As Object, _
    ByVal e As UserPreferenceChangingEventArgs)

        MessageBox.Show("UserPreferenceChanging: " & _
        e.Category.ToString())
    End Sub


    ' This method is called when the palette changes.
    Private Sub SystemEvents_PaletteChanged( _
    ByVal sender As Object, _
    ByVal e As EventArgs)

        MessageBox.Show("PaletteChanged")

    End Sub


    ' This method is called when the display settings change.
    Private Sub SystemEvents_DisplaySettingsChanged( _
    ByVal sender As Object, _
    ByVal e As EventArgs)

        MessageBox.Show("The display settings changed.")

    End Sub

End Class

Esempio 2

L'esempio di codice seguente illustra un servizio Di Windows molto semplice che gestisce gli TimeChanged eventi e UserPreferenceChanged . L'esempio include un servizio denominato , un modulo denominato SimpleServiceHiddenForme un programma di installazione. Il modulo fornisce il ciclo di messaggi richiesto dagli eventi di sistema.

Nota

I servizi non dispongono di cicli di messaggi, a meno che non siano autorizzati a interagire con il desktop. Se il ciclo di messaggi non viene fornito da un modulo nascosto, come in questo esempio, il servizio deve essere eseguito con l'account di sistema locale ed è necessario l'intervento manuale per abilitare l'interazione con il desktop. Ovvero, l'amministratore deve selezionare manualmente la casella di controllo Consenti al servizio di interagire con il desktop nella scheda Accesso della finestra di dialogo delle proprietà del servizio. In tal caso, viene fornito automaticamente un ciclo di messaggi. Questa opzione è disponibile solo quando il servizio viene eseguito con l'account di sistema locale. L'interazione con il desktop non può essere abilitata a livello di codice.

Il servizio in questo esempio avvia un thread che esegue un'istanza di HiddenForm. Gli eventi vengono collegati e gestiti nel modulo. È necessario associare gli eventi nell'evento di caricamento del modulo per assicurarsi che il modulo venga caricato per primo. in caso contrario, gli eventi non verranno generati.

Nota

L'esempio fornisce tutto il codice necessario, incluso il codice di inizializzazione del modulo generato in genere dalle finestre di progettazione di Visual Studio. Se si sviluppa il servizio in Visual Studio, è possibile omettere la seconda classe parziale e usare la finestra Proprietà per impostare l'altezza e la larghezza del modulo nascosto su zero, lo stile del bordo su FormBorderStyle.Nonee lo stato della finestra su FormWindowState.Minimized.

Per eseguire l'esempio:

  1. Compilare il codice dalla riga di comando. Il nome usato per il file di origine non è importante.

  2. Installare il servizio dalla riga di comando usando l'utilità Installutil.exe (strumento di installazione). Ad esempio, InstallUtil example.exe se il nome del file di origine è example.cs o example.vb. Per installare il servizio, è necessario essere un amministratore.

  3. Usare la console Servizi per avviare il servizio.

  4. Modificare l'ora di sistema o modificare le preferenze dell'utente, ad esempio le proprietà del mouse.

  5. Visualizzare i messaggi nella categoria Applicazione di Visualizzatore eventi.

  6. Usare la console Servizi per arrestare il servizio.

  7. Disinstallare il servizio dalla riga di comando usando l'opzione /u . Ad esempio: InstallUtil /u example.exe.

using System;
using System.ServiceProcess;
using System.Threading;
using System.Windows.Forms;
using System.Diagnostics;
using Microsoft.Win32;
using System.ComponentModel;
using System.Configuration.Install;

namespace SimpleServiceCs
{
    public class SimpleService : ServiceBase
    {
        static void Main(string[] args)
        {
            ServiceBase.Run(new SimpleService());
        }

        protected override void OnStart(string[] args)
        {
            EventLog.WriteEntry("SimpleService", "Starting SimpleService");
            new Thread(RunMessagePump).Start();
        }

        void RunMessagePump()
        {
            EventLog.WriteEntry("SimpleService.MessagePump", "Starting SimpleService Message Pump");
            Application.Run(new HiddenForm());
        }

        protected override void OnStop()
        {
            Application.Exit();
        }
    }

    public partial class HiddenForm : Form
    {
        public HiddenForm()
        {
            InitializeComponent();
        }

        private void HiddenForm_Load(object sender, EventArgs e)
        {
            SystemEvents.TimeChanged += new EventHandler(SystemEvents_TimeChanged);
            SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UPCChanged);
        }

        private void HiddenForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            SystemEvents.TimeChanged -= new EventHandler(SystemEvents_TimeChanged);
            SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(SystemEvents_UPCChanged);
        }

        private void SystemEvents_TimeChanged(object sender, EventArgs e)
        {
            EventLog.WriteEntry("SimpleService.TimeChanged", "Time changed; it is now " +
                DateTime.Now.ToLongTimeString());
        }

        private void SystemEvents_UPCChanged(object sender, UserPreferenceChangedEventArgs e)
        {
            EventLog.WriteEntry("SimpleService.UserPreferenceChanged", e.Category.ToString());
        }
    }

    partial class HiddenForm
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(0, 0);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Name = "HiddenForm";
            this.Text = "HiddenForm";
            this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
            this.Load += new System.EventHandler(this.HiddenForm_Load);
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.HiddenForm_FormClosing);
            this.ResumeLayout(false);
        }
    }

    [RunInstaller(true)]
    public class SimpleInstaller : Installer
    {
        private ServiceInstaller serviceInstaller;
        private ServiceProcessInstaller processInstaller;

        public SimpleInstaller()
        {
            processInstaller = new ServiceProcessInstaller();
            serviceInstaller = new ServiceInstaller();

            // Service will run under system account
            processInstaller.Account = ServiceAccount.LocalSystem;

            // Service will have Start Type of Manual
            serviceInstaller.StartType = ServiceStartMode.Automatic;

            serviceInstaller.ServiceName = "Simple Service";

            Installers.Add(serviceInstaller);
            Installers.Add(processInstaller);
        }
    }
}
Imports System.ServiceProcess
Imports System.Threading
Imports System.Windows.Forms
Imports System.Diagnostics
Imports Microsoft.Win32
Imports System.ComponentModel
Imports System.Configuration.Install

Namespace SimpleServiceVb
    Public Class SimpleService
        Inherits ServiceBase
    
        Shared Sub Main(ByVal args() As String) 
            ServiceBase.Run(New SimpleService())
        End Sub
    
        Protected Overrides Sub OnStart(ByVal args() As String) 
            EventLog.WriteEntry("SimpleService", "Starting SimpleService")
            Dim t As New Thread(AddressOf RunMessagePump)
            t.Start()    
        End Sub
    
        Sub RunMessagePump() 
            EventLog.WriteEntry("SimpleService.MessagePump", _
                "Starting SimpleService Message Pump")
            Application.Run(New HiddenForm())
        End Sub
    
        Protected Overrides Sub OnStop() 
            Application.Exit()
        End Sub
    End Class 

    Partial Class HiddenForm
        Inherits Form

        Public Sub New() 
            InitializeComponent()
        End Sub
    
        Private Sub HiddenForm_Load(ByVal sender As Object, ByVal e As EventArgs) 
            AddHandler SystemEvents.TimeChanged, AddressOf SystemEvents_TimeChanged
            AddHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UPCChanged
        End Sub 
    
        Private Sub HiddenForm_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) 
            RemoveHandler SystemEvents.TimeChanged, New EventHandler(AddressOf SystemEvents_TimeChanged)
            RemoveHandler SystemEvents.UserPreferenceChanged, _
                New UserPreferenceChangedEventHandler(AddressOf SystemEvents_UPCChanged)
        End Sub 
    
        Private Sub SystemEvents_TimeChanged(ByVal sender As Object, ByVal e As EventArgs) 
            EventLog.WriteEntry("SimpleService.TimeChanged", _
                "Time changed; it is now " & DateTime.Now.ToLongTimeString())
        End Sub 
    
        Private Sub SystemEvents_UPCChanged(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs) 
            EventLog.WriteEntry("SimpleService.UserPreferenceChanged", e.Category.ToString())
        End Sub 
    End Class

    Partial Class HiddenForm

        Private components As System.ComponentModel.IContainer = Nothing
    
        Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
            If disposing AndAlso Not (components Is Nothing) Then
                components.Dispose()
            End If
            MyBase.Dispose(disposing)
        End Sub
  
        Private Sub InitializeComponent() 
            Me.SuspendLayout()
            Me.AutoScaleDimensions = New System.Drawing.SizeF(6F, 13F)
            Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
            Me.ClientSize = New System.Drawing.Size(0, 0)
            Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None
            Me.Name = "HiddenForm"
            Me.Text = "HiddenForm"
            Me.WindowState = System.Windows.Forms.FormWindowState.Minimized
            AddHandler Me.Load, AddressOf Me.HiddenForm_Load
            AddHandler Me.FormClosing, AddressOf Me.HiddenForm_FormClosing
            Me.ResumeLayout(False)
        End Sub 
    End Class 

    <RunInstaller(True)> _
    Public Class SimpleInstaller
        Inherits Installer

        Private serviceInstaller As ServiceInstaller
        Private processInstaller As ServiceProcessInstaller
    
        Public Sub New() 
            processInstaller = New ServiceProcessInstaller()
            serviceInstaller = New ServiceInstaller()
        
            ' Service will run under system account
            processInstaller.Account = ServiceAccount.LocalSystem
        
            ' Service will have Start Type of Manual
            serviceInstaller.StartType = ServiceStartMode.Automatic
        
            serviceInstaller.ServiceName = "Simple Service"
        
            Installers.Add(serviceInstaller)
            Installers.Add(processInstaller)
        End Sub
    End Class 
End Namespace

Commenti

La SystemEvents classe consente di rispondere a tipi specifici di eventi di sistema.

Quando viene generato un evento di sistema, tutti i delegati collegati all'evento vengono chiamati usando il thread che monitora gli eventi di sistema. Pertanto, è necessario effettuare qualsiasi chiamata dai gestori eventi thread-safe. Se è necessario chiamare un evento di sistema non esposto come membro di questa classe, è possibile usare il InvokeOnEventsThread metodo .

Attenzione

Non eseguire un'elaborazione dispendiosa in termini di tempo nel thread che genera un gestore eventi di sistema perché potrebbe impedire il funzionamento di altre applicazioni.

Nota

Alcuni eventi di sistema potrebbero non essere generati in Windows Vista. Assicurarsi di verificare che l'applicazione funzioni come previsto in Windows Vista.

Metodi

CreateTimer(Int32)

Crea un nuovo timer di finestra associato alla finestra degli eventi di sistema.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
InvokeOnEventsThread(Delegate)

Richiama il delegato specificato utilizzando il thread che attende gli eventi di sistema.

KillTimer(IntPtr)

Termina il timer specificato dall'ID fornito.

MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Eventi

DisplaySettingsChanged

Viene generato quando l'utente modifica le impostazioni di visualizzazione.

DisplaySettingsChanging

Viene generato durante la modifica delle impostazioni di visualizzazione.

EventsThreadShutdown

Viene generato prima che venga terminato il thread che attende gli eventi di sistema.

InstalledFontsChanged

Viene generato quando l'utente aggiunge o rimuove dei tipi di carattere dal sistema.

LowMemory
Obsoleti.
Obsoleti.
Obsoleti.

Viene generato quando il sistema sta esaurendo la memoria RAM disponibile.

PaletteChanged

Viene generato quando l'utente passa a un'applicazione che utilizza una tavolozza diversa.

PowerModeChanged

Viene generato quando l'utente sospende o riavvia il sistema.

SessionEnded

Viene generato quando l'utente si disconnette o arresta il sistema.

SessionEnding

Viene generato quando l'utente tenta di disconnettersi o di arrestare il sistema.

SessionSwitch

Viene generato quando cambia l'utente connesso.

TimeChanged

Viene generato quando l'utente modifica l'ora nell'orologio di sistema.

TimerElapsed

Viene generato quando scade un intervallo di timer delle finestre.

UserPreferenceChanged

Viene generato quando viene modificata una preferenza utente.

UserPreferenceChanging

Viene generato durante la modifica di una preferenza utente.

Si applica a

Vedi anche