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 鼠标/键盘事件的监听和模拟的主要内容,如果未能解决你的问题,请参考以下文章

使用python监听模拟鼠标键盘事件

Java JTable 添加了一个键盘事件,和鼠标点击事件的监听,如何在我键盘事件起作用时,让鼠标事件失效

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaScript键盘鼠标监听功能