问题标签 [nsevent]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1340 浏览

macos - 如何在 OSX 上实现 scrollWheel 弹性滚动

我正在尝试创建一个自定义视图,它类似于 NSScrollView,但基于 CoreAnimation CAScrollLayer/CATiledLayer。基本上,我的应用程序需要大量近乎实时的 CGPath 绘图,并使用形状图层为这些路径设置动画(类似于 GarageBand 在录制时设置动画的方式)。我创建的第一个原型使用 NSScrollView,但我无法获得超过 20 帧/秒(原因是 NSRulerView 每次滚动事件发生时都会通过绘制更新,整个调用流程从 -[NSClipView scrollToPoint] 到 -[ NSScrollView reflectScrolledClipView:] 非常昂贵且效率低下)。

我创建了一个自定义视图,它使用 CAScrollLayer 作为滚动机制,使用 CATiledLayer 作为传统的 documentView(用于无限滚动选项),现在我可以接近 60fps。但是,我很难实现 scrollWheel 弹性滚动,而且我不知道该怎么做。这是我到目前为止的代码,如果有人能告诉我如何实现弹性滚动,我将不胜感激。

0 投票
1 回答
1791 浏览

objective-c - 在 Cocoa 的屏幕上观察全局鼠标位置?

我希望在鼠标移动并获取屏幕上的位置时收到通知。我试过这个:

然而,这似乎只在鼠标在我的应用程序窗口中时才有效。只要离开它,我就没有通知。直到我再次进入窗口。这个事件不应该是全球性的吗?

更新:

我提取了有问题的代码并制作了一个单独的示例项目(Dropbox-Link)。可以肯定的是,没有其他任何东西可以干扰它。这是一个干净的项目,只有上面的代码applicationDidFinishLaunching:。我得到相同的结果,这真的很奇怪。我将视频上传到 youtube:http ://www.youtube.com/watch?v=I3AKgmURaMk 。

这些是我的观察:

  1. 启动应用程序后,无论我将鼠标移动到何处,都不会立即传递任何事件。
  2. 单击应用程序的窗口将以某种方式激活事件传递。现在我收到 NSMouseMovedMask 事件,无论我在哪里移动鼠标(这是我想要实现的)。
  3. 单击返回 Xcode 不会改变任何内容。我不断收到事件。
  4. 但是,将焦点移回我的应用程序会导致奇怪的行为。当我将鼠标移到 Xcode 上时,我只会在窗口的某些部分上获得事件,而某些部分似乎会吸收事件。更具体地说,我没有通过编辑器或日志视图接收事件。我只在将鼠标移到灰色拆分视图分隔符区域(其中嵌入了标签栏)时才收到它们。
0 投票
1 回答
1563 浏览

objective-c - mouseEntered 事件上的 NSButton 图像阴影

我有一个无边框的 NSButton,它包含一个图像,并且是我的 ButtonEffect 类的子类,以检测 mouseEntered 和 mouseExited 事件。我的目标是在鼠标进入按钮区域时让图像的边缘发光。我知道我可以通过使用两个不同的图像(一个有阴影,另一个没有)来实现这一点,但我需要用一个图像来做到这一点。

这是我希望为 mouseEntered 事件实现的示例: 鼠标进入按钮区域

这是光标离开按钮区域后的样子: 鼠标退出按钮区域

这是我通过设置单元格背景的尝试,但它改变了整个按钮区域的颜色。

0 投票
0 回答
131 浏览

objective-c - 在 Objective-C 中设置键盘键只有一个目的

我需要一点帮助来找出一种方法,让键盘按键只有一个用途。我解释说:现在,键盘上的 1-8 键有一个与它们相关的动作NSEventFirstResponder。他们调用一个方法。问题是我需要能够通过在我的应用程序中的任何位置按 1-8 来调用此方法,因此当焦点设置在 TextField 上时,我可以使用这些键。我不希望 1-8 有他们通常的目的。数字键盘将是我可以使用数字的地方。我的问题:我想知道是否有办法做我想做的事?

提前致谢!

0 投票
2 回答
4807 浏览

objective-c - NSEvent addGlobalMonitorForEventsMatchingMask:热键拦截

Control我想拦截以+开头Shift并以字符结尾的热键(强制)。
我有以下代码:

我需要在我的代码中添加什么来检查用户是否按下了ControlShift+字符,以及用户按下了什么字符? 只有当我上面所说的是真的时,才会执行
代码。 这是我正在寻找的伪代码:NSLog(@"pressed!");

所以如果用户按下Control+ Shift+1 我会做一件事,如果Control+ Shift+2 做另一件事,依此类推......

0 投票
1 回答
1787 浏览

macos - 如何检测 OS X 中大写锁定键的键向上或键释放?

我在 OS X 检测击键时遇到问题。每当按下键盘键时,我都需要检测按键按下和按键释放或按键向上。当使用[ NSEvent addLocalMonitorForEventsMatchingMask: handler: ]. 这使您可以拦截和修改NSEvent各种事件类型的 s,包括常规打印键,以及NSKeyUp可用于检测 shift、ctrl、alt 和 cmd 键的 s。事实上,由于 shift、ctrl、alt 和 cmd 键的上键和下键的修饰符标志都发生了变化,因此可以通过检查.NSKeyDownNSFlagsChangedNSFlagsChanged[NSEvent modifierFlags][NSEvent keyCode]

但是,Capslock 是不同的。因为 capslock 修饰符实际上只对按下的键起作用,所以当你按下 capslock 时,你只会得到一个NSFlagsChangedwith capslock 被按下,而不是在它被释放时。并且不会使用修饰键(如 capslock 和 shift 和 ctrl 等)发出NSKeyUpNSKeyDown

任何人都可以提出一种方法,甚至是较低级别的界面,来获取大写锁定键事件吗?我将不得不求助于使用 kqueues 或其他东西吗?

0 投票
2 回答
826 浏览

cocoa - 更改 NSTextField 连续多次单击的行为

我有一个NSTextField由自定义视图嵌套的,我想更改连续多次单击的默认行为(双击、三次单击等),类似于文本节点 MindNode 的行为(见下图)。

我希望第一次单击以“激活”文本字段,然后从头开始(例如重置事件的单击计数)。

我有以下想法,但我不知道如何实现它们以及它们是否真的有意义:

  • 以某种方式更改使用时间+[NSEvent doubleClickInterval]并减慢第二次点击。
  • 以编程方式减少点击次数?
  • 使用 使 NSTextField 不可选择-hitTest:,将点击转发到超级视图,更改文本字段的某些参数并接受下一次点击。在这种情况下,第二次点击的点击次数仍然是 2。
  • 覆盖-mouseDown:而不是调用超级。这破坏了 NSTextField 的选择功能。

我希望有一种更简单的方法来实现这一点,但我忽略了这一点。

感谢您的回答!

这是问题的图形表示: 更改 NSTextField 的多次单击行为

0 投票
1 回答
209 浏览

objective-c - 有没有办法识别 NSNotification / NSEvent 来自哪个应用程序?

我已经开始收听全球keyDown事件。有没有办法从该事件来自哪个应用程序获取信息?

处理程序接收NSNotification实例并NSEvent成为其中的一部分。我能以某种方式从这些对象中提取这些信息吗?

听力片段:

观察员:

更新

全局按键不会从任何特定应用程序发送。我真正需要的是在事件处理程序中检查当前活动的应用程序:

这会返回NSDictionary我需要的信息。

0 投票
0 回答
257 浏览

cocoa - 使用 CGWindowListCopyWindowInfo 是否可以计算出鼠标指针在哪个窗口上方?

使用 CGWindowListCopyWindowInfo 是否可以确定鼠标指针是否在列出的任何窗口上?

我遇到的问题是 CGWindowListCopyWindowInfo 提供的窗口边界是基于左上角的。但是像...

是基于左下角的原点。

0 投票
0 回答
396 浏览

macos - 如何为多点触控手势添加 GlobalMonitorForEventsMatchingMask?

一切都很好 -在本地- 与......

NSLOGevent type: 12

但是,我在全局处理程序中没有收到任何手势事件。(尽管其他类型、滚动、单击等确实有效。)

NSLOG

这低于 10.8。我意识到手势不会在 10.6 上得到报告。但文档没有表明这不应该起作用。有任何想法吗?