سؤال

أرغب في تحديث قائمة أجهزة التخزين حيث يقوم المستخدم بإدخال مفاتيح USB وإضافة أقراص خارجية وتثبيت صور القرص.يبدو أن IOServiceAddInterestNotification الخاص بـ IOKit هو الحل الأمثل، ولكن الاستخدام الواضح لتسجيل الاهتمام العام في kIOMediaClass يمنحك فقط إشعارات لإلغاء تحميل وحدات التخزين، وفي بعض الأحيان فقط.

ما هي الطريقة الصحيحة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

الاستدعاءات التالية في DiskArbitration.h تفعل ما أريده بالضبط:

  • DARegisterDiskAppearedCallback
  • DARegisterDiskDisappearedCallback
  • DARegisterDiskDescriptionChangedCallback

إدراج هذه الأغطية وإزالتها (حتى المجلدات غير القابلة للتركيب)
أحداث تغيير البيانات الوصفية.

ملاحظة.لا تنسى أن تضيف الخاص بك DASession إلى حلقة التشغيل
أو أنك لن تحصل على أي رد الاتصال.

نصائح أخرى

<اقتباس فقرة>   

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

وكنت أستطيع الحصول على اثنين من أصل ثلاثة مع هذه القطعة من التعليمات البرمجية، التي أتصور لن تتطلب الكثير من العمل لتعطيك الثالث.

File:               USBNotificationExample.c

Description:        This sample demonstrates how to use IOKitLib and IOUSBLib to set up asynchronous
                    callbacks when a USB device is attached to or removed from the system.
                    It also shows how to associate arbitrary data with each device instance.

HTTP: //opensource.apple.com/source/IOUSBFamily/IOUSBFamily-385.4.1/Examples/Another٪20USB٪20Notification٪20Example/USBNotificationExample.c

ولقد استعملت شخصيا (نسخة معدلة بشكل طفيف من هذا الرمز) لفترة طويلة، لرصد اتصال من محركات الأقراص الصلبة USB.

وكما ترون من هذه العينة الصغيرة، فإنه قد يثبت بسهولة قابلة للتكيف لمراقبة محركات الأقراص المحملة. أو لا يجوز. YMMV.

    matchingDict = IOServiceMatching(kIOUSBDeviceClassName);        // Interested in instances of class
                                                                    // IOUSBDevice and its subclasses

وعندما يطابق

void DeviceAdded(void *refCon, io_iterator_t iterator)
{
    kern_return_t           kr;
    io_service_t            usbDevice;
    IOCFPlugInInterface     **plugInInterface=NULL;
    SInt32                  score;
    HRESULT                 res;    

    while ( (usbDevice = IOIteratorNext(iterator)) )
    {
        io_name_t                   deviceName;
        CFStringRef                 deviceNameAsCFString;
        MyPrivateData               *privateDataRef = NULL;
        UInt32                      locationID;

        printf("Device 0x%08x added.\n", usbDevice);

وهكذا دواليك، وهلم جرا.

هل كان يراقب /Volumes لإجراء تغييرات تفعل ما تريد؟

إذا كنت تعمل على مستوى الكاكاو، يمكنك أيضًا التسجيل لتلقي الإشعارات التالية من مساحة عمل:

  • NSWorkspaceDidMountNotification
  • NSWorkspaceDidRenameVolumeNotification
  • NSWorkspaceWillUnmountNotification
  • NSWorkspaceDidUnmountNotification
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top