Applescript: Erkennen, ob Maus oder Trackpad angeschlossen sind

Mein Skript legt die natürliche Bildlaufrichtung entweder einer Maus oder eines Trackpads (MB-Trackpad oder Magic Trackpad) fest, aber anstatt dem Benutzer zu erlauben, auszuwählen, welches angeschlossen ist, möchte ich in der Lage sein, eine der beiden Funktionen programmgesteuert auszuführen an welcher Hardware angeschlossen ist.
Gibt es eine Möglichkeit zu überprüfen (zB AS oder Shell Script), welche Hardware angeschlossen ist?

Folgendes möchte ich zum Beispiel erreichen:
Wenn: Trackpad angeschlossen ist, dann Trackpad-Funktion ausführen.
Andernfalls, wenn: Maus angeschlossen ist, Mausfunktion ausführen.
Andernfalls, wenn: Maus und Trackpad angeschlossen sind, führen Sie beide aus.
Andernfalls: Throw-Fehler, keine Eingabegeräte erkannt

Ich bin auf der Suche nach einer robusten Funktion, habe aber keine Ahnung, wo ich anfangen soll.

Mausfunktion:

tell application "System Preferences"
    reveal anchor "mouseTab" of pane id "com.apple.preference.mouse"
end tell
tell application "System Events" to tell process "System Preferences"
    tell checkbox 1 of window 1 to if value is 1 then click
end tell
quit application "System Preferences"

Trackpad-Funktion:

tell application "System Preferences"
    activate
    set current pane to pane "com.apple.preference.trackpad"
end tell

tell application "System Events"
    tell application process "System Preferences" to tell tab group 1 of window "Trackpad"
        click radio button 2
        if value of checkbox 1 is 1 then
            click checkbox 1
        end if
    end tell
end tell
quit application "System Preferences"

Vielen Dank im Voraus, jede Hilfe wird sehr geschätzt.

Antworten (2)

Okay, erstens habe ich Ihre Frage falsch gelesen, also habe ich meine Antwort umgeschrieben, und zweitens, weil die Einstellung "Bildlaufrichtung: natürlich" global ist, habe ich auch den Code umgeschrieben .

Wie codiert gibt es zwei Subroutinen , jeweils eine für die Maus und das Trackpad (intern oder extern), die basierend auf der Existenz der definierten Geräte aufgerufen werden. Dies ist wie im Wert für definiert mouseund wird von den BefehlenexternalTrackpad zurückgegeben, die so konfiguriert sind, dass sie nach Apple Magic Mouse, Apple Wireless Trackpad und einem internen Trackpad suchen. Diese Befehle können nach Bedarf/Wunsch geändert werden.internalTrackpaddo shell script

Was im Grunde passiert, ist, dass die Variablen initialisiert und dann von den if Anweisungen getestet und entsprechend wie codiert bearbeitet werden.

  • Wenn keine Maus und kein externes Trackpad vorhanden sind und kein internes Trackpad vorhanden ist, wird eine Meldung angezeigt und das Skript wird beendet.

  • Wenn keine Maus und kein externes Trackpad vorhanden sind, aber ein internes Trackpad vorhanden ist, wird die TrackpadIsAttached Subroutine ausgeführt, das Kontrollkästchen "Scroll-Richtung: natürlich" ist deaktiviert (falls aktiviert) und das Skript wird beendet, da die Einstellung global ist und es keine gibt weiterverarbeiten müssen.

  • Wenn entweder eine Maus oder ein Trackpad (intern oder extern) vorhanden ist, wird eine der Unterroutinen entsprechend codiert ausgeführt, das Kontrollkästchen "Scroll-Richtung: natürlich" ist deaktiviert (falls aktiviert) und das Skript wird beendet, da die Einstellung global ist und dies nicht erforderlich ist weiter verarbeiten.

on MouseIsAttached()
    tell application "System Preferences"
        activate
        set current pane to pane "com.apple.preference.mouse"
    end tell
    tell application "System Events" to tell process "System Preferences"
        tell radio button 1 of tab group 1 of window 1 to if value is 0 then click
        tell checkbox 1 of tab group 1 of window 1 to if value is 1 then click
    end tell
    tell application "System Preferences" to quit
end MouseIsAttached

on TrackpadIsAttached()
    tell application "System Preferences"
        activate
        set current pane to pane "com.apple.preference.trackpad"
    end tell
    tell application "System Events" to tell application process "System Preferences"
        tell radio button 2 of tab group 1 of window 1 to if value is 0 then click
        tell checkbox 1 of tab group 1 of window 1 to if value is 1 then click
    end tell
    tell application "System Preferences" to quit
end TrackpadIsAttached

tell current application
    set mouse to (do shell script "system_profiler SPBluetoothDataType | awk '{ FS = \": \" } ; /Apple Magic Mouse/ { print $2 }'")
    set externalTrackpad to (do shell script "system_profiler SPBluetoothDataType | awk '{ FS = \": \" } ; /Apple Wireless Trackpad/ { print $2 }'")
    set internalTrackpad to (do shell script "system_profiler SPUSBDataType | awk '/Trackpad:/ { print \"Internal Trackpad\" }'")

    if mouse is equal to "" and externalTrackpad is equal to "" then
        if internalTrackpad is equal to "Internal Trackpad" then
            my TrackpadIsAttached()
            return
        else
            display dialog "The Mouse and Trackpad are not connected." buttons {"OK"} default button 1
            return
        end if
    end if

    if mouse is equal to "Apple Magic Mouse" then
        my MouseIsAttached()
        return
    end if

    if externalTrackpad is equal to "Apple Wireless Trackpad" then
        my TrackpadIsAttached()
        return
    end if
end tell

Offensichtlich habe ich meine Apple Magic Mouse und das Apple Wireless Trackpad als Beispiele verwendet und getestet, um sicherzustellen, dass es auf meinem MacBook Pro wie codiert funktioniert. Sie können jeden Hersteller, jede Marke und jedes Modell für eine externe Maus und ein externes Trackpad verwenden, und Sie müssen nur das Skript entsprechend bearbeiten. Wenn Sie dabei zusätzliche Hilfe benötigen, fragen Sie einfach. Ich habe dies auch unter OS X 10.8.5 getestet und es hat wie geschrieben für mich funktioniert.

Gibt es einen Dienst, den ich konfigurieren kann, um das Skript jedes Mal auszuführen, wenn eines der Geräte angeschlossen oder getrennt wird?
@Nikhil Wagh, ich verwende zwei verschiedene Softwareprodukte, ohne Zugehörigkeit zu beiden, nur ein zufriedener Benutzer. Das eine ist EventScripts und das andere Hammerspoon . Die erste ist eine kostenpflichtige Anwendung , hat aber einen spezifischen Auslöser für Bluetooth- Ereignisse , und die zweite ist kostenlos .
@Nikhil Wagh, Wenn Sie die Benutzeroberfläche der Systemeinstellungen nicht sehen möchten , können Sie die activate Befehle auskommentieren oder entfernen . Beachten Sie, dass der Code wie geschrieben keine Fehlerbehandlung hat und möglicherweise die Verwendung eines delay Befehls zwischen den Ereignissen in den Handlern erfordert . Heutzutage füge ich normalerweise viel mehr Code hinzu , wenn ich mich mit UI-Scripting befasse , insbesondere mit Systemeinstellungen . Als Beispiel siehe meine Antwort apple.stackexchange.com/questions/419221/… um den Unterschied zu sehen.

Sie können wirklich nicht auf HID-Geräte (Tastaturen, Mäuse usw.) zugreifen, ohne in die eigentliche Softwareentwicklung einzusteigen.

Als "Hack" können Sie jedoch abfragen, system_profilerum zu sehen, was verbunden ist, wenn Sie bereits wissen, was Sie verbunden haben.

Um beispielsweise zu sehen, ob meine Logitech-Maus angeschlossen ist, können Sie den Befehl ausgebensystem_profiler SPUSBDataType | grep -i logitech

und es wird ausgegeben

Vendor ID: 0x046d  (Logitech Inc.)
Manufacturer: Logitech

Um also Ihr spezifisches Gerät anzugeben, können Sie den Befehl wie folgt ändern:system_profiler SPUSBDataType | grep -i 0x046d

Ein einfaches Bash-Skript zum Überprüfen, ob die Maus verbunden ist, wäre also

#!/bin/bash

mouse="0x046d"
test=`system_profiler SPUSBDataType | grep $mouse | cut -d : -f 2 | cut -d "(" -f 1`

if [ $mouse == $test  ]
  then 
  echo "Mouse Connected"
else
  echo "No Mouse Connected"
fi

exit 0

Sie würden etwas Ähnliches für das Trackpad tun