SystemEvents Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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 SimpleService
HiddenForm
e 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:
Compilare il codice dalla riga di comando. Il nome usato per il file di origine non è importante.
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
oexample.vb
. Per installare il servizio, è necessario essere un amministratore.Usare la console Servizi per avviare il servizio.
Modificare l'ora di sistema o modificare le preferenze dell'utente, ad esempio le proprietà del mouse.
Visualizzare i messaggi nella categoria Applicazione di Visualizzatore eventi.
Usare la console Servizi per arrestare il servizio.
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. |