好的,所以我试图登录控制台输出按下了哪些键。我无法理解可可结构,无论是Obj-c还是swift。我不是这两种语言的大师,但是......这就是我的代码:
import Cocoa
import Foundation
import AppKit
var loop = true
var idRegisterdEvent: AnyObject? = nil
func handlerEvent(myEvent: (NSEvent!)) -> Void {
print(myEvent.keyCode)
}
while loop {
idRegisterdEvent = NSEvent.addGlobalMonitorForEventsMatchingMask(NSEventMask.KeyDownMask, handler: handlerEvent)
}
我知道一切都错了,是的..但是,伙计,这些事件,我无法理解它们是如何运作的。
答案 0 :(得分:12)
在谷歌上花了几个小时后,我最终阅读了几个github资源。结果是someone has already figured it out。
基本上您需要创建一个<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<div>
<select id="companieslist" name="companieslist"></select>
</div>
,这样您的应用就可以收听系统事件。
以下显示了最低限度代码(NSApplicationDelegate
):
swift2
如果您只对仅捕获不可访问性事件感兴趣(例如:func acquirePrivileges() -> Bool {
let accessEnabled = AXIsProcessTrustedWithOptions(
[kAXTrustedCheckOptionPrompt.takeUnretainedValue() as String: true])
if accessEnabled != true {
print("You need to enable the keylogger in the System Preferences")
}
return accessEnabled == true
}
class ApplicationDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(notification: NSNotification?) {
acquirePrivileges()
// keyboard listeners
NSEvent.addGlobalMonitorForEventsMatchingMask(
NSEventMask.KeyDownMask, handler: {(event: NSEvent) in
print(event)
})
}
}
// preparing main loop
let application = NSApplication.sharedApplication()
let applicationDelegate = MyObserver()
application.delegate = applicationDelegate
application.activateIgnoringOtherApps(true)
application.run()
),那么您只需要更少的代码行即可获得NSWorkspaceDidActivateApplicationNotification
。我只添加了这个示例,因为我看到了NSRunLoop.mainRunLoop().run()
事件循环,它永远不会让你监听任何系统事件,因为它阻塞了主线程。
while true