Frage

ich eine Liste von Speichergeräten aktualisieren möchte, wenn der Benutzer USB-Schlüssel einfügt, fügt externe Laufwerke und montiert Disk-Images. IOKit des IOServiceAddInterestNotification wie die Art und Weise sieht zu gehen, aber die offensichtliche Verwendung der Registrierung von allgemeinem Interesse in kIOMediaClass gibt nur Ihnen Benachrichtigungen für von Volumes Aushängen und dann nur manchmal.

Was ist der richtige Weg, dies zu tun?

War es hilfreich?

Lösung

Die folgenden Anrufe in DiskArbitration.h tun genau das, was ich will:

  • DARegisterDiskAppearedCallback
  • DARegisterDiskDisappearedCallback
  • DARegisterDiskDescriptionChangedCallback

Diese Abdeckung Einsetzen, Entfernen (auch von unmountable Band)
Metadaten Änderungsereignisse.

P. S. Vergessen Sie nicht, Ihre DASession zu einem Runloop
hinzufügen oder Sie werden keine Rückrufe erhalten.

Andere Tipps

  

ich eine Liste von Speichergeräten aktualisieren möchte, wenn der Benutzer USB-Schlüssel einfügt, fügt externe Laufwerke und montiert Disk-Images.

Ich kann Ihnen zwei von drei mit diesem Stück Code bekommen, die ich mir vorstellen würde nicht viel mehr Arbeit benötigen Sie den dritten geben.

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

Ich habe persönlich verwendet (eine leicht modifizierte Kopie dieses Codes) für eine lange Zeit, um die Verbindung von USB-Festplatten zu überwachen.

Wie Sie aus dieser kleinen Stichprobe sehen kann, kann es leicht anpassbar beweisen eingebundenen Laufwerke zu überwachen. Oder auch nicht. YMMV.

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

und wenn sie paßt

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);

und so weiter, und so weiter.

Would beobachten /Volumes für Änderungen tun, was Sie brauchen?

Wenn Sie auf der Cocoa-Ebene zu arbeiten, passieren, können Sie auch registrieren die folgenden Mitteilungen von NSWorkspace :

  • NSWorkspaceDidMountNotification
  • NSWorkspaceDidRenameVolumeNotification
  • NSWorkspaceWillUnmountNotification
  • NSWorkspaceDidUnmountNotification
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top