Csharp/C Sharp/Development Class/SystemEvent

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Demonstrates using the Microsoft.SystemEvents class to intercept an event generated by the system

/*
C# Programming Tips & Techniques
by Charles Wright, Kris Jamsa
Publisher: Osborne/McGraw-Hill (December 28, 2001)
ISBN: 0072193794
*/
//
// Event.cs -- Demonstrates using the Microsoft.SystemEvents class to intercept
//             an event generated by the system.
//
//             Compile this program with the following command line:
//                 C:>csc Event.cs
//
namespace nsEvent
{
    using System;
    using System.Windows.Forms;
    using Microsoft.Win32;
    
    public class Event
    {
    //
    // Define the delegate
        public delegate void UserEventHandler (object obj, UserPreferenceChangedEventArgs args);
    //
    // Declare a variable that will hold the delegate
        static public event UserEventHandler ShowEvent;
        static public void Main ()
        {
    //
    // Create the delegate using the event handler (below)
              ShowEvent = new UserEventHandler (EvHandler);
    //
    // Creeate the event handler using the new operator
              UserPreferenceChangedEventHandler handler = new UserPreferenceChangedEventHandler(ShowEvent);
    //
    // Add the delegate to the system delegate list. This is a multi-cast delegate
    // and you must use the += operator to add the delegate. Use the -= operator
    // to remove the delegate
              SystemEvents.UserPreferenceChanged += handler;
    //
    // Show a message box to keep the program alive while you cause an event
              MessageBox.Show ("Hey! C Sharp", "System Events");
    //
    // Remove the delegate from the system delegate list
              SystemEvents.UserPreferenceChanged -= handler;
        }
    //
    // Declare and define the method that will be used as the event handler function
        static void EvHandler (object obj, UserPreferenceChangedEventArgs args)
        {
            /* Retrieve the category of the change */
            UserPreferenceCategory cat = args.Category;
            
            /* Build a string for the message box */
            string str = "User changed the " + cat.ToString() + " category";
            /*  Show the change event */
            MessageBox.Show (str, " event category");
        }
    }
}


Hooking up to a Windows Callback

/*
A Programmer"s Introduction to C# (Second Edition)
by Eric Gunnerson
Publisher: Apress  L.P.
ISBN: 1-893115-62-3
*/
// 31 - Interop\Calling Native DLL Functions\Hooking up to a Windows Callback
// copyright 2000 Eric Gunnerson
using System;
using System.Threading;
using System.Runtime.InteropServices;

public class HookinguptoaWindowsCallback
{
    public static void MyHandler(ConsoleCtrl.ConsoleEvent consoleEvent)
    {
        Console.WriteLine("Event: {0}", consoleEvent);
    }
    
    public static void Main()
    {
        ConsoleCtrl cc = new ConsoleCtrl();
        cc.ControlEvent += new ConsoleCtrl.ControlEventHandler(MyHandler);
        
        Console.WriteLine("Enter "E" to exit");        
        
        Thread.Sleep(15000);    // sleep 15 seconds
    }
}
public class ConsoleCtrl
{
    public enum ConsoleEvent
    {
        CTRL_C = 0,        // From wincom.h
        CTRL_BREAK = 1,
        CTRL_CLOSE = 2,
        CTRL_LOGOFF = 5,
        CTRL_SHUTDOWN = 6
    }
    
    public delegate void ControlEventHandler(ConsoleEvent consoleEvent);
    
    public event ControlEventHandler ControlEvent;
    
    // save delegate so the GC doesn"t collect it.
    ControlEventHandler eventHandler;
    
    public ConsoleCtrl()
    {
        // save this to a private var so the GC doesn"t collect it
        eventHandler = new ControlEventHandler(Handler);
        SetConsoleCtrlHandler(eventHandler, true);
    }
    
    private void Handler(ConsoleEvent consoleEvent)
    {
        if (ControlEvent != null)
        ControlEvent(consoleEvent);
    }
    
    [DllImport("kernel32.dll")]
    static extern bool SetConsoleCtrlHandler(ControlEventHandler e, bool add);
}