Разница между исполнением - быстрый скрипт и скомпилированный двоичный файл 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

И да, я не забываю перекомпилировать скрипт всегда при смене источника...:)

0 ответов

Другие вопросы по тегам