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*))block
和 NSLeftMouseUp
作为掩码,我设法捕捉到屏幕上的每一次点击
最后,我只需要检查我的点击是否与我的 dockIcon 的 CGRect 相关。 (我不得不花点心思,因为菜单被关闭后,applicationShouldHandleReopen:
被调用,因为我点击了它)
【讨论】:
以上是关于Cocoa:访问事件队列?的主要内容,如果未能解决你的问题,请参考以下文章
Verilog学习笔记设计和验证篇...............层次化事件队列