C# - Tálcán megjelenő ikon eseményei

forráskód letöltése
Az elmúlt hetekben jelentek meg cikkek a saját készítésű Tálca-ikonok témakörében. A saját készítésű komponensek előnye, hogy az alkalmazás ikonjának eseményei precízebben feldolgozhatók, valamint képességeik meghaladják a VS.NET beépített NotifyIcon komponens lehetőségeit. Cikkünkben bemutatunk egy példát arra vonatkozóan, hogy miként lehet a megjelenő ikonhoz gyorsmenüt kapcsolni, valamint hogyan dolgozható fel az ikon fölött előbukkanó, informatív üzenetablakra történő kattintás eseménye.
Cikkünkben nem részletezzük a létrehozást teljes egészében, csupán a gyorsmenü-készítés, és a buborék-üzenetablak eseményének feldolgozását tárgyaljuk.
A mellékelt példa NIComponent komponensét használja, mely megjelenít egy ikont az alkalmazás indulásakor a Tálcán, valamint megjeleníti szükség esetén a buborék-üzenetablakot. Az üzenetablakra kattintva elérhetjük, hogy elinduljon az Internet Explorer egy példánya, és betöltődjön a Software Online kezdőlapja.
A példa-alkalmazás a háttérben fut, az ikonra történő kattintáskor megjelenő gyorsmenü egyik pontjából lehet láthatóvá tenni.
Gyorsmenü megjelenítése
Az ikont megvalósító komponensünk egy Form típusú tagobjektumon keresztül éri el funkcióit, az ikonhoz kapcsolódó műveleteket a Shell_NotifyIcon API metódussal végezzük el. A műveletek a Form tagobjektum ablakkezelőjét használják (Handle property).
A gyorsmenü megjelenítése érdekében a NotifyClass osztályban deklarálunk egy ContextMenu típusú tagot, melynek értéke a Form-ra felhelyezett ContextMenu komponens lesz.
private ContextMenu cMenu = null;
Ennek állítására természetesen létrehozunk egy property-t.
public ContextMenu ContextMenu
{
  set
  {
    cMenu = value;
  }
  get
  {
    return cMenu;
  }
}
Létrehoztunk egy saját típust a komponens eseményeihez.
public delegate void NIHandler(object sender, uint id);
Deklaráltunk egy eseménykezelőt a gyorsmenü megjelenítéséhez.
public event NIHandler RCNotify;
A NotifyForm osztály DefWndProc metódusát felülírva kaphatjuk el a felhasználó által az alkalmazás számára küldött üzeneteket. Az egér gombjának felengedéséhez rendeljük az RCNotify eseményt. Először meghatározzuk, hogy a kapott üzenet felhasználói üzenet-e, majd az üzenet paraméteréből lekérdezzük, hogy pontosan mi is volt az.
protected override void DefWndProc(ref Message msg)
{
  if(msg.Msg == 0x400)
  {
    uint msgId = (uint)msg.LParam;
    uint id = (uint)msg.WParam;
    switch(msgId)
    {
      ...
      case 0x205:
        if(RCNotify != null)
          RCNotify(this, id);
        break;
      ...
    }
    ...
  }
}
Az eseményre írtunk egy kezelőt.
private void OnRClick(object sender, uint id)
{
  ...
  POINT point = new POINT();
Az osztályban deklaráltunk egy struktúrát, mely az egérkurzor aktuális helyzetét tartalmazza a GetCursorPos metódus meghívása után.
  GetCursorPos(ref point);
Aktivizáljuk az ikon objektumot reprezentáló Form-ot.
  SetForegroundWindow(nForm.Handle);
Majd meghívjuk a ContextMenu objektum – mely az alkalmazás tagobjektuma – OnPopup metódusát.
  cMenu.GetType().InvokeMember("OnPopup", BindingFlags.NonPublic|BindingFlags.InvokeMethod|BindingFlags.Instance, null, cMenu, new Object[] {System.EventArgs.Empty});
Végül a TrackPopupMenuEx metódus segítségével megjelenítjük a menüt az egér pozíciójában.
  TrackPopupMenuEx(cMenu.Handle, 64, point.x, point.y, nForm.Handle, IntPtr.Zero);          
}
Egérkattintás a balon-üzenetpanelen
A DefWndProc metódusban fel kell dolgoznunk a ShowBallon metódussal létrehozott üzenetablak kattintás-eseményét.
...
case 0x405:
  if(CBNotify != null)
    CBNotify(this, id);
  break;
...
Gondoskodtunk róla, hogy az általunk deklarált esemény bekövetkezzen. A létrehozott kezelőmetódusban elindítunk egy Explorer példányt. Ehhez a COM komponenspalettáról ki kellett választanunk a Microsoft Internet Control ActiveX vezérlő elemet, és referenciaként a projektünkhöz kell adnunk. A hivatkozást elhelyezve a forráskód elején használhatók a komponens osztályai.
using SHDocVw;
Létrehozunk egy példányt a megfelelő osztályból.
InternetExplorer ie = new InternetExplorer();
IWebBrowserApp browser = (IWebBrowserApp)ie;
Láthatóvá tesszük.
browser.Visible = true;
Majd a Navigate metódussal a Software Online URL-jét betöltjük.
browser.Navigate("http://www.softwareonline.hu",ref o,ref o,ref o,ref o);