تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
تعقب إضافة وإزالة الأقراص المرتبطة عبر منفذ Usb
#1
كاتب الموضوع : samerselo

فكرة العمل: بناء فئة Class للتعامل مع الأقراص القابلة للإزالة والتي يتم توصيلها إلى الحاسب عبر منفذ USB
الفوائد: مثال على البرمجة غرضية التوجه، بناء الفئات، إضافة الخصائص، إطلاق الأحداث

سنقوم أولا بتعريف فئة Class لتضم عملنا وعندما ننتهي منها يجب أن تضم العديد من الخصائص والاجراءات المفيدة

كود :
Public Class UsbDriveDetect

End Class
سنحتاج لإضافة مرجع لـ ManagementEventWatcher حتى نستطيع مراقبة ما يحدث داخل الجهاز والذي يقوم بمراقبة الأحداث المنطلقة بناء على استعلام معين و سنستخدم الكلمة WithEvents في التعريف حتى نستطيع تعقب الأحداث الصادرة عنه

كود :
Private WithEvents m_MediaConnectWatcher As ManagementEventWatcher
ولكي يعمل بشكل صحيح سنحتاج لإضافة مرجع لـ System.Management
قم بإضافة System.Management من قائمة Project بند Add Reference ثم استخدم الاستيراد التالي قبل كل شئ في الملف وحتى قبل تعريف الفئة أيضا

كود :
Imports System.Management
سنحتاج أيضا لبناء مشيد الفئة Sub New الذي سيضبط التهيئة الأساسية لفئتنا والذي سنقوم من خلاله بضبط خصائص ManagementEventWatcher الذي يقوم بالعمل لأجلنا

كود :
Sub New()
Dim Query2 As New WqlEventQuery("SELECT * FROM __InstanceOperationEvent WITHIN 1 " _
& "WHERE TargetInstance ISA 'Win32_DiskDrive'")
Me.m_MediaConnectWatcher = New ManagementEventWatcher
Me.m_MediaConnectWatcher.Query = Query2
End Sub
سنقوم الآن بوضع إجراءات لبدء وإيقاف تعقب وضع وإزالة أقراص USB

كود :
Public Sub StartDetection()
Me.m_MediaConnectWatcher.Start()
End Sub

Public Sub StopDetection()
Me.m_MediaConnectWatcher.Stop()
End Sub
نريد الآن اعلام مستخدم فئتنا عن طريق إطلاق حدث خاص عندما يتم وضع أو إزالة قرص عن طريق منفذ USB في الجهاز سنقوم بإنشاء فئة مشتقة من System.EventArgs و ذلك كفئة فرعية ضمن فئتنا الأساسية UsbDriveDetect حتى نستخدمها لإطلاق حدثنا

ولكن سنحتاج أولا للتعريف التالي لإعادة حالة القرص هل تم وضعه أو إزالته ضع التعريف التالي بعد بداية تعريف الفئة

كود :
Public Enum EnUsbArrivedRemoved
Arrived
Removed
End Enum
وفيما يلي نص الفئة الخاصة بالحدث

كود :
Public Class UsbDriveEeventArgs
Inherits System.EventArgs

Private m_DeviceName As String
Private m_DriveLetter As String
Private m_ArrivedRemoved As EnUsbArrivedRemoved

Sub New(ByVal DeviceName As String, ByVal DriveLetter As String, ByVal ArrivedRemoved As EnUsbArrivedRemoved)
Me.m_DeviceName = DeviceName
Me.m_DriveLetter = DriveLetter
Me.m_ArrivedRemoved = ArrivedRemoved
End Sub

Public ReadOnly Property DeviceName() As String
Get
Return Me.m_DeviceName
End Get
End Property

Public ReadOnly Property DriveLetter() As String
Get
Return Me.m_DriveLetter
End Get
End Property

Public ReadOnly Property ArrivedRemoved() As EnUsbArrivedRemoved
Get
Return Me.m_ArrivedRemoved
End Get
End Property

End Class
و أيضا بعد بداية تعريف الفئة ضع السطر التالي الذي سيعرف الحدث الذي سنقوم بإطلاقه

كود :
Public Event UsbDeviceArrivedRemoved(ByVal sender As Object, ByVal e As UsbDriveEeventArgs)
قبل استخدام الحدث UsbDeviceArrivedRemoved لإعلام المستخدم بوضع أو إزالة قرص USB يجب الحصول على حرف ذلك القرص

كود :
Private Function GetDriveLetterFromDisk(ByVal Name As String) As String
Dim oq_part, oq_disk As ObjectQuery
Dim mos_part, mos_disk As ManagementObjectSearcher
Dim obj_part, obj_disk As ManagementObject
Dim ans As String = ""

' WMI queries use the "\" as an escape charcter
Name = Replace(Name, "\", "\\")

' First we map the Win32_DiskDrive instance with the association called
' Win32_DiskDriveToDiskPartition. Then we map the Win23_DiskPartion
' instance with the assocation called Win32_LogicalDiskToPartition

oq_part = New ObjectQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & Name & """} WHERE AssocClass =

Win32_DiskDriveToDiskPartition")
mos_part = New ManagementObjectSearcher(oq_part)
For Each obj_part In mos_part.Get()

oq_disk = New ObjectQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & obj_part("DeviceID") & """} WHERE AssocClass =

Win32_LogicalDiskToPartition")
mos_disk = New ManagementObjectSearcher(oq_disk)
For Each obj_disk In mos_disk.Get()
ans &= obj_disk("Name") & ","
Next
Next

Return ans.Trim(","c)
End Function
حيث نمرر له اسم الجهاز الذي تم الكشف عن إضافته وهو يعيد لنا حرف السواقة المرتبطة به وذلك باستخدم ManagementObjectSearcher للحصول عليه حيث ستلاحظ أن طريقة الاستعلام هنا مشابهة لاستعلامات قواعد البيانات ولكنها هنا على فئات WMI بدلا من جداول قاعدة البيانات

كود :
Private Sub m_MediaConnectWatcher_EventArrived(ByVal sender As Object, ByVal e As System.Management.EventArrivedEventArgs) Handles

m_MediaConnectWatcher.EventArrived

Dim mbo, obj As ManagementBaseObject
' the first thing we have to do is figure out if this is a creation or deletion event
mbo = CType(e.NewEvent, ManagementBaseObject)
' next we need a copy of the instance that was either created or deleted
obj = CType(mbo("TargetInstance"), ManagementBaseObject)
If obj("InterfaceType") = "USB" Then
Select Case mbo.ClassPath.ClassName
Case "__InstanceCreationEvent"
Dim Ee As New UsbDriveEeventArgs(obj("Caption"), GetDriveLetterFromDisk(obj("Name")), EnUsbArrivedRemoved.Arrived)
RaiseEvent UsbDeviceArrivedRemoved(Me, Ee)
Case "__InstanceDeletionEvent"
Dim Ee As New UsbDriveEeventArgs(obj("Caption"), "", EnUsbArrivedRemoved.Removed)
RaiseEvent UsbDeviceArrivedRemoved(Me, Ee)
End Select
End If
End Sub
والآن سنتتبع الحدث EventArrived الخاص بـ ManagementEventWatcher حتى نعرف متى تم وضع أو إزالة قرص USB وذلك كي نستطيع اطلاق حدثنا المناسب وفقا للحدث المستقبل

كود :
Private Sub m_MediaConnectWatcher_EventArrived(ByVal sender As Object, ByVal e As System.Management.EventArrivedEventArgs) Handles


m_MediaConnectWatcher.EventArrived


        Dim mbo, obj As ManagementBaseObject
        ' the first thing we have to do is figure out if this is a creation or deletion event
        mbo = CType(e.NewEvent, ManagementBaseObject)
        ' next we need a copy of the instance that was either created or deleted
        obj = CType(mbo("TargetInstance"), ManagementBaseObject)
        If obj("InterfaceType") = "USB" Then
            Select Case mbo.ClassPath.ClassName
                Case "__InstanceCreationEvent"
                    Dim Ee As New UsbDriveEeventArgs(obj("Caption"), GetDriveLetterFromDisk(obj("Name")), EnUsbArrivedRemoved.Arrived)
                    RaiseEvent UsbDeviceArrivedRemoved(Me, Ee)
                Case "__InstanceDeletionEvent"
                    Dim Ee As New UsbDriveEeventArgs(obj("Caption"), "", EnUsbArrivedRemoved.Removed)
                    RaiseEvent UsbDeviceArrivedRemoved(Me, Ee)
            End Select
        End If
End Sub
}}}
تم الشكر بواسطة:


الردود في هذا الموضوع
تعقب إضافة وإزالة الأقراص المرتبطة عبر منفذ Usb - بواسطة Raggi Tech - 03-10-12, 09:20 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  إضافة و نسخ الخطوط الخاصّة لمجلّد خطوط الوينداوز عبد العزيز البسكري 2 4,198 08-05-23, 12:03 AM
آخر رد: ابو محمد محمد محمد
  [مقال] إضافة تقارير Crystal report إلى فيجوال 2010 اسامه الهرماوي 3 6,111 05-10-21, 01:38 PM
آخر رد: mohameddahab867
  [مقال] إضافة خاصية التحجيم التلقائي - AutoSize - إلى أداة مربع النص - TextBox sooriaty03 10 12,819 21-03-21, 09:53 PM
آخر رد: عبد الهادي بهاب
  مثال للتعامل مع الجداول المرتبطة - عن طريق الكلاسات ابو ليلى 24 16,451 04-10-20, 06:16 PM
آخر رد: محمد بن عطية
  طريقة إضافة اختصار للصنف في شاشة المبيعات ملهمـ 5 6,421 14-07-20, 12:24 PM
آخر رد: ابراهيم ايبو
  إضافة نغمات إفتتاحيّة أثناء تسطيب البرنامج عبد العزيز البسكري 11 7,890 23-01-19, 08:35 PM
آخر رد: عبد العزيز البسكري
  الكامل في VB.Net (التعامل مع الأقراص و المجلدات و الملفات) rinawi 3 4,372 25-05-13, 01:11 PM
آخر رد: shaker.soft
  الإصدار الاول من إضافة الرسائل ( Msge ) والصور مجانآ ali.alfoly 12 6,592 25-05-13, 01:10 PM
آخر رد: shaker.soft
  تعلم إضافة ألعاب الفلاش و مقاطع الفيديو الفلاشية إلى برنامجك Aly El-Haddad 1 3,131 13-04-13, 06:46 PM
آخر رد: Sajad
  عمل ملف Setup لتنصيب برنامجك + إضافة برامج أساسية ظمن عملية التنصيب(شرح بالصور) RaggiTech 0 7,522 05-10-12, 02:25 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم