macOS 开发 NSView添加鼠标监控
一、鼠标点击事件响应流程简述:
1.鼠标硬件先接收到用户点击;
2.然后交给鼠标驱动来处理,这个驱动是在Mac OS X内核运行的;
3.处理完就通过I/O Kit传递给window sever的事件队列。
4.而window server则负责分派这些事件到对应进程的run-loop.
二、步骤
1.自定义VC1 继承自NSView ;
2.在VC1.m的drawRect方法中添加监控区域NSTrackingArea和监控样式
- 如果VC1不添加NSTrackingArea,即使实现了监控方法,也不会调用。
- 监控区域要使用dirtyRect,而非self.frame,否则位置会错误。
鸣谢KeyboardLife

左边打印监听的位置点击事件等的数据,右边有颜色的就是监听鼠标的区域。
ViewController.m中
#import "ViewController.h"
#import "VC1.h" @interface ViewController () @end @implementation ViewController -(void)viewDidLoad {
[super viewDidLoad]; VC1 * view = [[VC1 alloc] initWithFrame:NSMakeRect(100, 100, 300, 300)];
[view setWantsLayer:YES];//开启layer支持,不然设置背景色无用
view.layer.backgroundColor = [NSColor blueColor].CGColor;
[self.view addSubview:view]; } - (void)setRepresentedObject:(id)representedObject {
[super setRepresentedObject:representedObject]; // Update the view, if already loaded.
} @end
新建的VC1继承NSView
VC1.h
#import <Cocoa/Cocoa.h> NS_ASSUME_NONNULL_BEGIN @interface VC1 : NSView @end NS_ASSUME_NONNULL_END
VC1.m
#import "VC1.h" @interface VC1 () @end @implementation VC1 //鼠标进入追踪区域
-(void)mouseEntered:(NSEvent *)event {
NSLog(@"mouseEntered =========");
} //mouserEntered之后调用
-(void)cursorUpdate:(NSEvent *)event {
NSLog(@"cursorUpdate =========="); //更改鼠标光标样式
[[NSCursor pointingHandCursor] set];
} //鼠标退出追踪区域
-(void)mouseExited:(NSEvent *)event {
NSLog(@"mouseExited ========");
} //鼠标左键按下
-(void)mouseDown:(NSEvent *)event {
//event.clickCount 不是累计数。双击时调用mouseDown两次,clickCount第一次=1,第二次 = 2.
if ([event clickCount] > 1) {
//双击相关处理
} NSLog(@"mouseDown ==== clickCount: %ld buttonNumber: %ld",event.clickCount,event.buttonNumber); self.layer.backgroundColor = [NSColor redColor].CGColor; //获取鼠标点击位置坐标:先获取event发生的window中的坐标,在转换成view视图坐标系坐标。
NSPoint eventLocation = [event locationInWindow];
NSPoint center = [self convertPoint:eventLocation fromView:nil]; NSLog(@"center: %@",NSStringFromPoint(center)); //判断是否按下了Command键
if ([event modifierFlags] & NSEventModifierFlagCommand) {
[self setFrameRotation:[self frameRotation] + 90.0];
[self setNeedsDisplay:YES]; NSLog(@"按下了Command键 ---- ");
} } //鼠标左键起来
-(void)mouseUp:(NSEvent *)event {
NSLog(@"mouseUp ======"); self.layer.backgroundColor = [NSColor greenColor].CGColor;
} //鼠标右键按下
- (void)rightMouseDown:(NSEvent *)event {
NSLog(@"rightMouseDown =======");
} //鼠标右键起来
- (void)rightMouseUp:(NSEvent *)event {
NSLog(@"rightMouseUp ======= ");
} //鼠标移动
- (void)mouseMoved:(NSEvent *)event {
NSLog(@"mouseMoved ========= ");
} //鼠标按住左键进行拖拽
- (void)mouseDragged:(NSEvent *)event {
NSLog(@"mouseDragged ======== ");
} //鼠标按住右键进行拖拽
- (void)rightMouseDragged:(NSEvent *)event {
NSLog(@"rightMouseDragged ======= ");
} #pragma mark 监控区域要使用dirtyRect,而非self.frame,否则位置会错误。
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect]; // Drawing code here. [self addTrackingArea:[[NSTrackingArea alloc] initWithRect:dirtyRect options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved |
NSTrackingCursorUpdate |
NSTrackingActiveWhenFirstResponder |
NSTrackingActiveInKeyWindow |
NSTrackingActiveInActiveApp |
NSTrackingActiveAlways |
NSTrackingAssumeInside |
NSTrackingInVisibleRect |
NSTrackingEnabledDuringMouseDrag
owner:self userInfo:nil]]; [self becomeFirstResponder]; }
@end
macOS 开发 NSView添加鼠标监控的更多相关文章
- AI应用开发实战 - 从零开始搭建macOS开发环境
AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 建议和反馈,请发送到 https ...
- 转:Loadrunner添加服务器监控
一.监控windows系统:1.监视连接前的准备 1)进入被监视windows系统,开启以下二个服务Remote Procedure Call(RPC) 和Remote Registry ...
- zabbix实现自动发现功能添加磁盘监控
zabbix实现对磁盘动态监控 - Lenwood 原文 http://www.cnblogs.com/baizhantang/p/3253246.html 主题 Linux命令 zabbix 前言 ...
- OpenGl读取导入3D模型并且添加鼠标移动旋转显示
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11543828.html 最近实习要用到opengl库就是跟opencv 有点像的那个,然后下了 ...
- OpenGl 导入读取多个3D模型 并且添加鼠标控制移动旋转
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11627508.html 前言: 因为接下来的项目需求是要读取多个3D模型,并且移动拼接,那么我 ...
- 分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控
Zabbix3.0 Server以后就自带了MySQL插件来监控mysql数据库的模板,只需要配置好agent客户端,然后在web端给主机增加模板就行了. 以下是公司线上的zabbix3.0环境下添加 ...
- Openstack Murano(kilo)二次开发之添加Volume
Openstack Murano(kilo)二次开发之添加Volume 欢迎转载,转载请注明出处:http://www.cnblogs.com/fmnisme/p/openstack_murano_a ...
- 李洪强iOS开发之添加手势
李洪强iOS开发之添加手势 02 - 添加手势
- 【C#】添加鼠标管轮事件
对FlowLayoutPanel添加鼠标滚轮事件 在mainform中添加事件 his.flowLayoutPanel1.MouseWheel += new System.Windows.Forms. ...
- 如何在C#添加鼠标右键菜单
C#添加鼠标右键方法步骤: 1 选中要添加右键功能的Form或者控件,打开控件的设计页面. 2 从工具箱中找到ContextMenuStrip控件,将这个控件拖曳到Form或者控件的设计页面上.这时系 ...
随机推荐
- Nacos集群搭建(三个节点)
Nacos集群安装 一,在每台服务器上安装nacos 1,准备安装包 github下载点 2,在/usr/local/目录下创建一个文件夹用于上传和解压Nacos cd /usr/local/ # ...
- (一)钉钉宜搭低代码应用开发高级认证之远程API调用方法示例
大家好,我是代号六零一,在此分享近期学习的低代码开发知识~,如有疑问欢迎在评论区下方点评,作者愿与您一道共同探讨: 一.创建数据源 二.请求地址配置 钉钉路径示例:/dingtalk/web/APP_ ...
- [{"morpherRegistry":{},"dynaClass":{"dynaProperties":[{"indexed":false,"mapp
将list存到json中后,json返回的内容是[{"morpherRegistry":{},"dynaClass":{"dynaProperties ...
- LCD1602液晶屏
单片机系统用到的液晶屏(简称LCD)有很多类型,最常用的有两种,一种是1602型(即每行可显示16个字符,同时能显示2行),另一种是12864型(即每行可显示128个点,每列可显示64个点).一般前一 ...
- 一个厂区宿舍管理后台密码爆破 - selenium版
title: 某厂区宿舍管理后台密码爆破-selenium测试 author: 杨晓东 permalink: 某厂区宿舍管理后台密码爆破-selenium测试 date: 2021-10-02 11: ...
- Java学习笔记(三)java方法
学习笔记3 Java方法 一.什么是方法 System.out.println() 是什么 System是一个类,out是一个对象,println()就是一个方法 意思是调用System中的out对象 ...
- 解决点击el-dialog对话框,body抖动问题
在vue中点击el-dialog对话框有时候body样式会加上padding-right:8px. 百度了一下多数是增加padding,然后他们的解决办法是 全局给body加样式 padding-ri ...
- 面向对象基础之基础—控制台C#模拟银行ATM存取操作实例
c#控制台应用程序ATM银行操作实例.主要介绍了设计的方法:使用的类介绍:具体的运行界面:程序代码.代码直接写在一起放在Programm.cs中,拷贝可直接运行. 一.设计 1.原则上采用三层:(1) ...
- Pycharm去除白色波浪线
- Angular JS入门 (一)事件监听(二)多控制器思想与模块化编程(三)路由router
Angular JS入门 ️将流式结构--->模块化 一.事件监听 1.事件监听 前言 NG框架中通过对元素标签添加[ng-事件名] 指令,来对元素添加事件监听 而事件监听的回调函数需要在con ...