gpt4 book ai didi

macos - 碳/ cocoa 悬停在码头事件上

转载 作者:行者123 更新时间:2023-12-03 17:24:10 28 4
gpt4 key购买 nike

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

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

最佳答案

这是因为 Dock 会覆盖任何光标更改。您需要做的是设置一个反复触发以更改光标的计时器。

首先创建一个允许您更改光标的方法,然后设置自定义光标

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,您的应用程序将无法再设置光标。要使您的应用程序能够在后台控制光标,您必须使用私有(private) API,因此没有 Mac App Store。

在桥接 header 中,您可以添加以下代码

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)

关于macos - 碳/ cocoa 悬停在码头事件上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11775060/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com