我正在开发一个应用程序,它使用 Carbon 和 Cocoa 来处理一些为 Windows 编写的 C++ 代码。我目前遇到一个问题,当用户 cmd+tabs 离开窗口,或者只是将鼠标悬停在 Dock 上(不仅仅是应用程序的图标 - Dock 上的任何位置)时,光标(使用 Cocoa NSCursor 类) 从自定义光标更改为正常的 OS X 光标。
基本上,有谁知道当用户将鼠标悬停在 Dock 上时(Carbon 和 Cocoa)会发送什么到应用程序?
我正在开发一个应用程序,它使用 Carbon 和 Cocoa 来处理一些为 Windows 编写的 C++ 代码。我目前遇到一个问题,当用户 cmd+tabs 离开窗口,或者只是将鼠标悬停在 Dock 上(不仅仅是应用程序的图标 - Dock 上的任何位置)时,光标(使用 Cocoa NSCursor 类) 从自定义光标更改为正常的 OS X 光标。
基本上,有谁知道当用户将鼠标悬停在 Dock 上时(Carbon 和 Cocoa)会发送什么到应用程序?
这是因为 Dock 会覆盖任何光标更改。您需要做的是设置一个重复触发以更改光标的计时器。
首先创建一个让您更改光标的方法,然后设置 customCursor
func changeCursor() {
/* Code here to create custom cursor */
customCursor.set()
}
然后当你准备改变光标时,你需要启动定时器并让它反复触发
//cursorTimer is an NSTimer object that you need to keep track of
self.cursorTimer = NSTimer.scheduledTimerWithTimeInterval(0.001, target:self, selector: "changeCursor", userInfo: nil, repeats: true)
完成后,您可以使计时器无效
self.cursorTimer.invalidate()
此外,这仅在您的应用程序处于最前面时才有效。如果有人按下 command+tab,您的应用将无法再设置光标。要使您的应用程序在后台控制光标,您必须使用私有 API,因此没有 Mac App Store。
在您的桥接头中,您可以添加以下代码
typedef int CGSConnectionID;
CGError CGSSetConnectionProperty(CGSConnectionID cid, CGSConnectionID targetCID, CFStringRef key, CFTypeRef value);
int _CGSDefaultConnection();
然后在您的 AppDelegate 中,您可以添加此代码applicationDidFinishLaunching
let propertyString = CFStringCreateWithCString(kCFAllocatorDefault, "SetsCursorInBackground", 0)
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue)