Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Foundation
- import AppKit
- import IOKit
- import IOKit.hid
- let manager = IOHIDManagerCreate(
- kCFAllocatorDefault,
- IOOptionBits(kIOHIDOptionsTypeNone)
- )
- var locked = false
- @discardableResult
- func shell(_ args: String...) -> Int32 {
- let task = Process()
- task.launchPath = "/usr/bin/env"
- task.arguments = args
- task.launch()
- task.waitUntilExit()
- return task.terminationStatus
- }
- func runScript() {
- shell("bash", "/Users/max.chuquimia/xcode/KeyMonitor/run.sh")
- print("unlocking soon")
- // Don't allow multiple presses quickly
- DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
- locked = false
- print("unlocked")
- }
- }
- let matchDict: [CFString: NSNumber] = [
- kIOHIDVendorIDKey as CFString: NSNumber(value: 5050),
- kIOHIDProductIDKey as CFString: NSNumber(value: 1),
- ]
- IOHIDManagerSetDeviceMatching(manager, matchDict as CFDictionary)
- // IOHIDManagerRegisterDeviceMatchingCallback(manager, { (_, _, _, inIOHIDDeviceRef) in
- // print(inIOHIDDeviceRef)
- // }, nil)
- IOHIDManagerScheduleWithRunLoop( manager, CFRunLoopGetMain(), CFRunLoopMode.defaultMode!.rawValue);
- IOHIDManagerRegisterInputValueCallback(manager, { (context, inResult, inSent, value) in
- guard !locked else { return }
- locked = true
- print("INPUT DETECTED")
- print(IOHIDValueGetIntegerValue(value))
- runScript()
- }, nil)
- let result = IOHIDManagerOpen(manager, IOOptionBits(kIOHIDOptionsTypeNone))
- assert(result == kIOReturnSuccess)
- CFRunLoopRun()
Add Comment
Please, Sign In to add comment