Разница между исполнением - быстрый скрипт и скомпилированный двоичный файл swiftc
Иметь небольшой swift
сценарий называется skey.swift
которые отправляют нажатие клавиши в процессы, даже когда они не активны (например, находятся в фоновом режиме), их PID
(идентификатор процесса).
import Foundation
if CommandLine.argc < 2 {
print("Error", CommandLine.arguments[0], " No arguments are passed.")
exit(1)
}
let src = CGEventSource(stateID: CGEventSourceStateID.hidSystemState)
let key_d = CGEvent(keyboardEventSource: src, virtualKey: 0x12, keyDown: true) // key "1" press
let key_u = CGEvent(keyboardEventSource: src, virtualKey: 0x12, keyDown: false) // key "1" release
for i in 1 ..< Int(CommandLine.argc) {
if let pid = pid_t(CommandLine.arguments[i]) {
print("arg:", pid)
key_d?.postToPid( pid )
key_u?.postToPid( pid )
}
}
Прецедент:
- Скажем, запустить
TextEdit.app
иNotes.app
- запишите их PID из
ps axu | grep -E 'MacOS/(TextEdit|Notes)'
- пример
me 87756 3,3 0,3 4716112 97228 ?? S 11:54 0:28.01 /Applications/Notes.app/Contents/MacOS/Notes
me 83077 0,0 0,1 4609916 49312 ?? S 8:00 0:04.58 /Applications/TextEdit.app/Contents/MacOS/TextEdit
- запомните PID:
87756 83077
- Запустите из Терминала
swift skey.swift 87756 83077
- в ОБЕИХ окнах приложений (TextEdit и Notes) добавляется "1", даже если они находятся в фоновом режиме (Терминал находится в активном приложении).
- Итак, скрипт работает как положено!!
Проблема
- скомпилировать сценарий с
swiftc skey.swift
- запустите скомпилированный двоичный файл с теми же аргументами, например
./skey 87756 83077
- ТОЛЬКО первый PID получает "1" (в данном случае только в примечаниях)
Почему такая разница между запуском скрипта:
swift skey.swift 87756 83077
- или
./skey 87756 83077
И да, я не забываю перекомпилировать скрипт всегда при смене источника...:)