Cocoa:访问事件队列?

Posted

技术标签:

【中文标题】Cocoa:访问事件队列?【英文标题】:Cocoa : Access the event queue ? 【发布时间】:2012-07-05 00:39:20 【问题描述】:

我有一个应用程序在单击停靠图标时会打开一个菜单 (- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag)

菜单“停止”当前线程的执行,直到它关闭。因此,一旦菜单关闭,我只会收到applicationShouldHandleReopen: 的电话。

我认为使用计时器可以检查队列中是否存在此类方法调用。但这可能吗?还是有其他方法可以解决我的问题? (我想在第二次单击停靠图标时关闭菜单)

【问题讨论】:

不清楚您的问题是什么?不希望默认行为怎么办?每当用户在您的应用程序成为活动应用程序之前单击停靠图标时,都会调用 applicationShouldHandleReopen: 方法。每当用户单击并按住或右键单击您的停靠图标时,都会显示您的应用程序的停靠菜单。显示菜单时再次单击停靠图标将关闭它,而不会将您的应用程序置于前台。您可以指定自定义项目出现在此停靠菜单中,但不能使用 applicationShouldHandleReopen: 对不起,我不够清楚:我使用了一个自定义菜单,单击左键时会显示。 我明白了。 Finder 和其他应用程序使用的标准右键单击 Dock 菜单自定义是否适合您? here 描述了向此菜单添加静态或动态菜单项。当用户左键单击时弹出一个类似 Dock 的菜单会让一些用户感到惊讶,并且会出现左键和右键单击呈现不同菜单的 UI 怪异。 【参考方案1】:

我找到解决问题的方法:

我使用此代码Getting the position of my application's dock icon using Cocoa's Accessibility API 来访问我的停靠图标的位置和大小。

然后使用 NSEvent + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))blockNSLeftMouseUp 作为掩码,我设法捕捉到屏幕上的每一次点击

最后,我只需要检查我的点击是否与我的 dockIcon 的 CGRect 相关。 (我不得不花点心思,因为菜单被关闭后,applicationShouldHandleReopen: 被调用,因为我点击了它)

【讨论】:

以上是关于Cocoa:访问事件队列?的主要内容,如果未能解决你的问题,请参考以下文章

Verilog学习笔记设计和验证篇...............层次化事件队列

基于 HBase 构建可伸缩的分布式事务队列

Freertos-事件标志组,消息队列,信号量,二值信号量,互斥信号量

EventQueue 事件队列

网卡多队列

如何真正快速地从 Amazon SQS(简单队列服务)队列中删除事件?