Mac 鼠标/键盘事件的监听和模拟
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mac 鼠标/键盘事件的监听和模拟相关的知识,希望对你有一定的参考价值。
参考技术A
参考:
《 macOS AppKit 的事件响应简介 》
《 Mac OSX 鼠标键盘事件的监听和模拟 》
在 macOS 系统中 鼠标 、 键盘 和 触摸板 的活动事件都会产生底层的系统事件,首先传递到 IOKit 框架 处理后存储到队列中,通知 Window Server 服务层 处理。Window Server 存储到 FIFO 优先队列 中,然后逐一转发到 当前活动窗口 或者能响应这个事件的 应用程序 去处理。
在 macOS 或者 ios 程序中,都会有一个 Main Run Loop 的线程, RunLoop 循环 中会遍历 event 消息队列 ,逐一分发这些事件到应用中合适的对象去处理。具体来说就是调用 NSApp 的 sendEvent: 方法发送消息到 NSWindow , NSWindow 再分发到 NSView 视图 对象,由其鼠标或键盘事件响应方法去处理。
响应者链是 Application Kit 事件处理架构的中心机制,由一系列链接在一起的响应者对象组成,事件或者动作消息可以沿着这些对象进行 传递 。消息沿着响应者链向上、向更高级别的对象传递,直到 最终被处理 (如果 最终 还是 没有被处理,就会被抛弃 )。
事件响应者 Responders 类 为核心应用程序架构的三个主要模式或机制定义了一个接口:
从层级上看离观察者最近的视图优先响应事件,通过 view 的 hitTest 方法检测,满足 hitTest 方法的的子视图优先响应事件。
NSApplication , NSWindow , NSDrawer , NSWindowController , NSView 以及 继承于 NSView 的所有控件对象都直接或间接继承了 Responders 类 ,所以这些类都能处理鼠标和键盘事件。
NSResponder : https://developer.apple.com/documentation/appkit/nsresponder
NSEvent : https://developer.apple.com/documentation/appkit/nsevent
NSEventType : https://developer.apple.com/documentation/appkit/nseventtype
NSEventModifierFlags : https://developer.apple.com/documentation/appkit/nseventmodifierflags/
《 Mac OSX 鼠标键盘事件的监听和模拟 》中提到:鼠标/键盘事件的监听有多种方法,第一种方法是重写事件响应者 Responders 对应的方法来获取对应的事件;第二是通过重写 NSWindow 的 sendEvent: 方法; 第三是通过的 NSEvent 提供静态方法来监听对应的事件~
没有逐一去试验,如下 键盘事件 / 鼠标事件 只是各用一种方式实现了相应 监听 !
鼠标的事件类型:
1.左/右键的按下与抬起事件
2.左键的双击(或者多击事件)—— clickCount 属性
3.鼠标移动事件
4.左键或者右键的拖拽事件
5.鼠标的滚动事件
使用如下 重写 Responders 的 方法 来 监听 鼠标事件:
使用例子🌰 :(在\'ViewController.swift\'文件中)
键盘事件 的 响应 :其中 keyUp 方法和 keyDown 方法——点击时只要 含有普通按键 就会 响应 、 flagsChanged 方法—— 只响应 特殊 的 功能控制按键 !
鼠标事件 的 响应 :在鼠标事件的方法中,通过 event.type ——判断鼠标 进行 的 相应操作 、 event.locationInWindow ——获取鼠标的 位置 ~
1.模拟鼠标事件:
2.模拟鼠标滚动事件
鼠标滚轮事件只要传入水平和垂直方向的偏移即可实现。
3.模拟键盘事件
键盘事件的模拟需要注意的就是 CGEventFlags flags 参数,该参数用来模拟组合键的实现,类型定义如下:
kCGEventFlagMaskAlphaShift :大小写锁定键是否处于开启状态
kCGEventFlagMaskShift :Shift 键是否按下
kCGEventFlagMaskControl :Control 键是否按下
kCGEventFlagMaskAlternate :Alt 键是否按下,对应 Mac 键盘的 option 键
kCGEventFlagMaskCommand :Command 键是否按下,对应 Windows 的 WIN 键
kCGEventFlagMaskHelp :Help 键
kCGEventFlagMaskSecondaryFn :Fn 键
kCGEventFlagMaskNumericPad :数字键盘
kCGEventFlagMaskNonCoalesced :没有任何键按下
如果有多个控制键同时按下,则使用位运算的或 | 加上对应的键值即可。例如模拟 Command + Control + S :
goyohol\'s essay
JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听
JavaFX实战系列
JavaFX源码分析和实战:javaFX线程结构分析
JavaFX源码分析和实战之launcher启动器:两种启动javaFX的方式及launch(args[])参数设置和获取
JavaFX源码分析和实战:两种启动窗口方式和窗口切换实现
JavaFX源码分析和实战之窗体(Stage)分析及使用
JavaFX源码分析实战:如何设置窗体标题小图标和任务栏图标
JavaFX源码分析和实战之场景(Scene)分析及使用,多场景切换实现
JavaFX源码分析和实战之Image组件:最简单的图片浏览器实现
JavaFX源码分析和实战之音频播放:MediaPlayer
以上是关于Mac 鼠标/键盘事件的监听和模拟的主要内容,如果未能解决你的问题,请参考以下文章
Java JTable 添加了一个键盘事件,和鼠标点击事件的监听,如何在我键盘事件起作用时,让鼠标事件失效
JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听
JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听