Az üzenetek figyeléséhez szükségünk lesz egy új osztályra, melyben implementáljuk az IMessageFilter interfészt. Ennek egyetlen függvénye van a PreFilterMessage. Ez minden olyan esetben meghívásra kerül, ha alkalmazásunk üzenetet kap. Paraméterként egy Message nevű struktúrát kapunk, melyből megtudhatjuk az üzenet tartalmát. E struktúrában rendelkezésünkre áll egy Msg, LParam, WParam property, mely az üzenet tulajdonságairól tájékoztat bennünket.
Ha e függvény visszatérési értéke igaz lenne, akkor az alkalmazásunk már nem kapja meg ezt az üzenetet. Ezt felhasználva befolyásolhatjuk, hogy milyen üzenetek kerüljenek az alkalmazásunk által feldolgozásra. Továbbá azt se felejtsük el, hogy a függvény paramétere ref típusú, tehát annak értékeit megváltoztathatjuk, így egy létrejött üzenetnek akár más paramétereket is adhatunk.
Mellékelt példában csak annyit teszünk, hogy egy ListBox-ba folyamatosan megjelenítjük az üzeneteket, kiszűrve a listából az egér mozgására vonatkozókat, mivel ebből lenne a legtöbb.
public class MessageViewer: IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
if (m.Msg != 0x0200 && m.Msg != 0x00A0)
{
listBox.SelectedIndex = listBox.Items.Add(m.ToString());
}
return false;
}
}
Az osztályunk elkészítése önmagában még nem hozna eredményt, ezt hozzá is kell adnunk az Application osztály AddMessageFilter függvényének segítségével.
Application.AddMessageFilter(new MessageViewer(listBox1));