HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Üzenetfigyelés


Példaprogram letöltése

7114 bájt

Alkalmazásunk futása során számtalan üzenetet kap. Ezeket programból megfigyelhetjük, kezelhetjük, sőt szükség esetén be is avatkozhatunk az üzenetek által kiváltott hatásokba.
Mellékelt példában azt figyeljük, hogy a felhasználó megváltoztatja-e programunk futása alatt a rendszeridőt.

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.
        OnTimeChange();
      }
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.
      return false;
    }
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.
        TimeChange(this);
      }
    }   
  }
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();      
    }

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2002 évkönyv 506. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |