一、鼠标点击事件响应流程简述:

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添加鼠标监控的更多相关文章

  1. AI应用开发实战 - 从零开始搭建macOS开发环境

    AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 建议和反馈,请发送到 https ...

  2. 转:Loadrunner添加服务器监控

    一.监控windows系统:1.监视连接前的准备        1)进入被监视windows系统,开启以下二个服务Remote Procedure Call(RPC) 和Remote Registry ...

  3. zabbix实现自动发现功能添加磁盘监控

    zabbix实现对磁盘动态监控 - Lenwood 原文  http://www.cnblogs.com/baizhantang/p/3253246.html 主题 Linux命令 zabbix 前言 ...

  4. OpenGl读取导入3D模型并且添加鼠标移动旋转显示

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11543828.html 最近实习要用到opengl库就是跟opencv 有点像的那个,然后下了 ...

  5. OpenGl 导入读取多个3D模型 并且添加鼠标控制移动旋转

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11627508.html 前言: 因为接下来的项目需求是要读取多个3D模型,并且移动拼接,那么我 ...

  6. 分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控

    Zabbix3.0 Server以后就自带了MySQL插件来监控mysql数据库的模板,只需要配置好agent客户端,然后在web端给主机增加模板就行了. 以下是公司线上的zabbix3.0环境下添加 ...

  7. Openstack Murano(kilo)二次开发之添加Volume

    Openstack Murano(kilo)二次开发之添加Volume 欢迎转载,转载请注明出处:http://www.cnblogs.com/fmnisme/p/openstack_murano_a ...

  8. 李洪强iOS开发之添加手势

    李洪强iOS开发之添加手势 02 - 添加手势

  9. 【C#】添加鼠标管轮事件

    对FlowLayoutPanel添加鼠标滚轮事件 在mainform中添加事件 his.flowLayoutPanel1.MouseWheel += new System.Windows.Forms. ...

  10. 如何在C#添加鼠标右键菜单

    C#添加鼠标右键方法步骤: 1 选中要添加右键功能的Form或者控件,打开控件的设计页面. 2 从工具箱中找到ContextMenuStrip控件,将这个控件拖曳到Form或者控件的设计页面上.这时系 ...

随机推荐

  1. Spring注解补充(一)

    注解补充 挑一些常用,但是深入不多的总结一下. Bean的声明周期 在@Bean注解中,添加init属性和destroy属性 @Bean(initMethod = "initMethod&q ...

  2. Vulhub 漏洞学习之:Dubbo

    Vulhub 漏洞学习之:Dubbo 目录 Vulhub 漏洞学习之:Dubbo 1 Aapche Dubbo Java反序列化漏洞(CVE-2019-17564) 1.1 环境安装 1.2 漏洞利用 ...

  3. 空间数据库中ST_开头的来由

    1. 引言 在使用空间数据库(如,PostGIS)时,我们经常使用的空间函数(如,ST_Distance(geometry, geometry).ST_Area(geometry)等)都是以ST_开头 ...

  4. Vue 超长列表渲染性能优化

    参考:https://juejin.cn/post/6979865534166728711#heading-3 组件懒加载参考:https://github.com/xunleif2e/vue-laz ...

  5. B站【挽救小白第一季】前端代码记录笔记

    1. 新建工程命令: $ vue init mpvue/mpvue-quickstart my-project 参考mpvue官方快速入门:http://mpvue.com/mpvue/quickst ...

  6. Execution failed for task ':app:checkDebugDuplicateClasses'解决办法

    A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable & ...

  7. array copy() 的简单使用

    源码: public static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length) ...

  8. C++程序设计实验三 类和对象Ⅱ

    动态int型数组类Vector_int的定义实现源码(vector_int.hpp) #include <iostream> #include <cassert> using ...

  9. Linux服务器监控性能测试

    1.进程与线程的定义与区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位[例如电脑上的不同程序] 线程是进程的一个实体,是cpu调度和分派的基本 ...

  10. SAP FBL1N屏幕增强,增加自定义的列

    需求 因财务想要在查看未清和已清凭证的时候,看到是该凭证是否哪一个采购人员创建,因此新增一列创建人,关联关系是 EKKO-EBELN=BSEG-ZUONR,这里关联分配号是因为之前开发自动清账的时候做 ...