HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

CD-meghajtó eseményeinek figyelése programból


Példaprogram letöltése

8485 bájt

A Windows üzenetküldő és továbbító rendszerének eredményeképpen az operációs rendszer felügyelete alatt működő valamennyi hardver- és szoftvereseményről értesülhet alkalmazásunk. Elegendő a megfelelő üzenet figyelésének funkcióját beépíteni a programba. Cikkünkben elkészítünk egy példát, melyben figyeljük azt az eseményt, amikor a CD-meghajtók valamelyikébe lemezt helyezünk, vagy eltávolítjuk onnan azt.

A mellékelt példa kipróbálásához indítsa el az alkalmazást, és helyezzen el egy lemezt a számítógép CD-meghajtójában, majd vegye ki onnan.
A CD-meghajtókhoz kapcsolódó események keletkezésekor a Windows a WM_DEVICECHANGE üzenetet juttatja el a futó process-ek mindegyikéhez (broadcast üzenet).
Az üzenet objektum első paramétere (wParam) hordozza az információt arról, hogy tulajdonképpen milyen esemény is következett be a meghajtónál, a második paraméter (lParam) tartalmazza a meghajtó jellemzőit. A szükséges típusok deklarációit a Win32 osztályban helyeztük el.
A példában a WM_DEVICECHANGE üzenet figyeléséhez deklarálnunk kell egy konstanst, melyet használhatunk a Form objektumunk WndProc ablakkezelő függvényének felülírásakor.
public const int WM_DEVICECHANGE = 0x0219;
Szükségünk van egy felsorolt típusra, melynek elemei tartalmazzák a bekövetkezett esemény azonosítóját.
public enum DeviceEvent : int
{
  DBT_DEVICEARRIVAL = 0x8000,
  DBT_DEVICEREMOVECOMPLETE = 0x8004
}
Egy másik felsorolt típusban helyezzük el azokat a konstansokat, melyekkel beazonosítjuk majd a meghajtó-típust.
public enum DeviceType : int
{
  DBT_DEVTYP_OEM = 0x00000000,
  DBT_DEVTYP_DEVNODE = 0x00000001,
  DBT_DEVTYP_VOLUME = 0x00000002,
  DBT_DEVTYP_PORT = 0x00000003,
  DBT_DEVTYP_NET = 0x00000004
}
Létrehoztunk egy struktúrát az üzenet második paraméterének lekérdezéséhez. A struktúra a DEV_BROADCAST_HDR menedzselt megfelelője.
public struct DEV_BROADCAST_HDR 
{
  public int dbch_size;
  public DeviceType dbch_devicetype;
  private int dbch_reserved;
}
És még egyet a meghajtóra vonatkozó információk részleteinek feldolgozásához.
public struct DEV_BROADCAST_VOLUME 
{ 
  public int dbcv_size;
  public DeviceType dbcv_devicetype;
  private int dbcv_reserved;
  public int dbcv_unitmask;
  public int dbcv_flags;
}
A DEV_BROADCAST_VOLUME struktúra dbcv_unitmask mezője tartalmazza majd a meghajtó betűjelére utaló bitmintát. Ennek konvertálására szolgál a MaskToDriveLetter metódusunk, mely egy string-ben adja vissza a meghajtó betűjelét.
public static string MaskToDriveLetter(int mask)
{
  ...
  if(mask > 0)
  {
Amennyiben a kapott paraméter értéke nagyobb mint nulla, akkor a bitminta kiértékelődik. A bitsorozat értéke adja meg, hogy melyik meghajtónál zajlott le esemény. Ha a bitminta első jegye 1 értékű, akkor az „A” meghajtóról van szó, stb.
    for (;mask != 0;mask >>= 1)
    {
A változó értékét egy bitszintű összehasonlításnak vetjük alá, hogy eldöntsük, hányadik jegy 1 értékű. A sorszám értékét hozzáadjuk a 65-höz, majd a kapott értéket karakterré konvertáljuk (ASCII kód).
      if ((mask & 1)!=0) 
      { 
        ret.Append((char)(65 + _value));
        ret.Append(":,");
      }
      _value++;
    }
    ret.Remove(ret.Length - 1,1);
  }
  return ret.ToString();
  ...
}
Az alkalmazás ablakának WndProc metódusában végezzük el a lényegi munkát.
if(message.Msg == Win32.WM_DEVICECHANGE)
{
Amennyiben a WM_ DEVICECHANGE üzenet érkezett az ablakhoz, akkor lekérdezzük az első paramétert.
  lEvent = (Win32.DeviceEvent)message.WParam.ToInt32();
Ha a meghajtóba lemezbehelyezés történt, akkor lekérdezzük a második paramétert.
  if (lEvent == Win32.DeviceEvent.DBT_DEVICEARRIVAL)
  {
    lBH = (Win32.DEV_BROADCAST_HDR)Marshal.PtrToStructure(message.LParam,typeof(Win32.DEV_BROADCAST_HDR));
Ha a kapott üzenet a CD-meghajtótól érkezett, akkor meghatározzuk a betűjelét is.
    if(lBH.dbch_devicetype == Win32.DeviceType.DBT_DEVTYP_VOLUME)
    {
      lVolume = (Win32.DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(message.LParam,typeof(Win32.DEV_BROADCAST_VOLUME));
      listBox1.Items.Clear();
      listBox1.Items.Add("Lemezt helyeztek a(z) " + Win32.MaskToDriveLetter(lVolume.dbcv_unitmask) + " meghajtóba");
    }
  }
A második paraméter értéke DBT_DEVICEREMOVECOMPLETE, ha a lemez eltávolításra kerül, így a függvény másik részében ezt a feltételt értékeljük ki.
  if (lEvent == Win32.DeviceEvent.DBT_DEVICEREMOVECOMPLETE)
  {
    ...
  }
}

Cikksorozat

#IDKategóriaCikk címeSorozat
2591WindowsTippek és trükkök - RAS - Modem csengetési szám állítása1. rész
2622WindowsTippek és trükkök - Program futtatása más felhasználóként2. rész
2640WindowsA Windows ikonméretének megváltoztatása és Windows 2000 Asztaltémák3. rész
2657WindowsTippek és trükkök - Internet Explorer4. rész
2667WindowsTippek és trükkök5. rész
2684WindowsAlapértelmezések állítása, telepítési fájlok helye, intéző nézetek6. rész
2696WindowsBiztonsági trükkök7. rész
2702WindowsWindows XP trükkök8. rész
2729WindowsWindows 2000 és XP tippek, trükkök9. rész
2757WindowsRegistry trükkök10. rész
2784WindowsTippek, trükkök11. rész
2829WindowsTippek, trükkök12. rész
2889WindowsWindows XP tippek13. rész
2909WindowsTippek Windows XP-hez14. rész
2919WindowsWindows tippek15. rész
2924WindowsWindows tippek16. rész
2963WindowsWindows tippek17. rész
2973WindowsWindows Tippek18. rész
2981WindowsWindows tippek19. rész
2990WindowsTippek-trükkök20. rész
3027WindowsIIS tippek21. rész
3034WindowsWindows XP tippek-trükkök22. rész
3088WindowsWindows 2000/XP tippek, trükkök23. rész
3133WindowsWindows XP tippcsokor24. rész
3140WindowsWindows XP tippek, trükkök25. rész
3152WindowsXP és IIS tippek - trükkök26. rész
3158WindowsWindows XP tippek, trükkök27. rész
3168WindowsTippek, trükkök28. rész
3170WindowsRegistry trükkök29. rész
3179WindowsTippek, trükkök30. rész
3197WindowsWindows XP tippek, trükkök31. rész
3205WindowsTippek, trükkök32. rész
3214WindowsTippek, trükkök33. rész
3223WindowsTippek, trükkök34. rész
3233WindowsTippek, trükkök35. rész
3271WindowsTippek, trükkök36. rész
3307WindowsTippek, trükkök37. rész
3370WindowsTippek, trükkök38. rész
3399WindowsTippek, trükkök39. rész
3510WindowsTippek, trükkök40. rész
3611WindowsHardverrel kapcsolatos tippek, trükkök41. rész
3668WindowsRegistry trükkök42. rész
3711WindowsTippek, trükkök43. rész
3771WindowsTippek, trükkök44. rész
3801WindowsTippek, trükkök45. rész
3831WindowsTippek, trükkök46. rész
3891WindowsTippek, trükkök47. rész
3921WindowsTippek, trükkök48. rész
3981WindowsTippek, trükkök49. rész
4041WindowsTippek, trükkök50. rész
4071WindowsTippek, trükkök51. rész
4151WindowsTippek, trükkök52. rész
4171C#Tippek, trükkök53. rész
4211WindowsTippek, trükkök54. rész
4251WindowsTippek, trükkök55. rész
4281WindowsTippek, trükkök56. rész
3589DelphiTippek, trükkök57. rész
3718DelphiTippek, trükkök58. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 416. 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 |