1

我正在开发一个应用程序,它使用 Carbon 和 Cocoa 来处理一些为 Windows 编写的 C++ 代码。我目前遇到一个问题,当用户 cmd+tabs 离开窗口,或者只是将鼠标悬停在 Dock 上(不仅仅是应用程序的图标 - Dock 上的任何位置)时,光标(使用 Cocoa NSCursor 类) 从自定义光标更改为正常的 OS X 光标。

基本上,有谁知道当用户将鼠标悬停在 Dock 上时(Carbon 和 Cocoa)会发送什么到应用程序?

4

1 回答 1

0

这是因为 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)
于 2016-01-17T18:47:16.723 回答