A megvalósításhoz egy ún. üzenet szűrőt kell létrehoznunk, vagyis szükség van egy olyan osztályra, melyben implementáljuk az IMessageFilter interfészt. A mellékelt példában ezt a Class1.cs-ben találjuk.
public class TimeChangeFilter: IMessageFilter
{
Az IMessageFilter interfésznek egyetlen függvénye van, amit fel kell használnunk, ez pedig a PreFilterMessage. Itt egy Message struktúrát kapunk paraméterként, melynek Msg property-jéből megtudhatjuk a programunknak szánt üzenet kódját.
Ezt ellenőrizve könnyen elcsíphetjük a WM_TIMECHANGE üzenetet, melyet akkor kap meg minden alkalmazás, ha a rendszeridő megváltozott.
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == 30) //WM_TIMECHANGE
{
Amikor ez bekövetkezik, akkor meghívjuk belső, OnTimeChange függvényünket, mely aktivizálja majd osztályunk eseményét, így értesítve az osztályt létrehozó alkalmazásunkat.
A PreFilterMessage függvény visszatérési értékére még érdemes odafigyelnünk: ha itt hamis értéket adunk meg, akkor az aktuális üzenetet a programunk is megkapja, ha viszont itt igaz értéket adunk, akkor a programunk nem kapja meg az üzenetet, mivel az igaz visszatérési értékkel azt jelezzük, hogy a feldolgozást már elvégeztük. Ezzel azonban megvalósíthatjuk azt is, hogy bizonyos üzeneteket a programunk meg se kapjon. Fontos szem előtt tartani azt a tényt is, hogy a PreFilterMessage függvény Message paraméterét, illetve annak property-jeit meg is változtathatjuk, ezzel elhitethetjük az alkalmazással, hogy bizonyos üzenetek az általunk megadott paraméterekkel érkeznek.
Ha tehát elfogjuk a WM_TIMECHANGE üzenetet, akkor osztályunknak kell egy eseményt generálnia. Ehhez delegálunk egy esemény típust.
public delegate void TimeChangeEventHandler(object sender);
Majd létrehozunk egy TimeChange nevű eseményt.
public event TimeChangeEventHandler TimeChange;
Végül már csak az említett OnTimeChange függvény elkészítése marad hátra, mely aktivizálja a TimeChange eseményt.
public void OnTimeChange()
{
Itt fontos, hogy ellenőrizzük, hogy az eseményhez lett-e eseménykezelő függvény aktivizálva már vagy sem.
if (TimeChange != null)
{
Ha van hozzárendelve, csak akkor aktivizálhatjuk az eseményt.
Nézzük most a Form1.cs-t és az imént létrehozott osztály felhasználásának lehetőségét. Mivel üzeneteket már a program indulásának pillanatától kezdve kapja alkalmazásunk, így célszerű mielőbb elkezdeni a figyelést, ezért a Form1 konstruktoránál létre is hozunk egy példányt a TimeChangeFilter osztályunkból.
public Form1()
{
InitializeComponent();
TimeChangeFilter tcf = new TimeChangeFilter();
Az osztályunk TimeChange eseményéhez hozzárendeljük a saját DoTimeChange nevű függvényünket.
tcf.TimeChange += new TimeChangeEventHandler(DoTimeChange);
A létrehozás önmagában még kevés lenne a működőképességhez. Ahhoz, hogy működjön is a dolog, szükséges az Application osztály AddMessageFilter függvényének használata. Itt paraméterként kell megadnunk az üzenetszűrő osztályunk imént létrehozott példányát.
Application.AddMessageFilter(tcf);
}
Amikor tehát a TimeChange esemény aktív lesz, akkor kerül meghívásra a DoTimeChange függvényünk. Ekkor biztosak lehetünk abban, hogy a rendszeridő megváltozott.
protected void DoTimeChange(object sender)
{
label2.Text = DateTime.Now.ToString();
}