gpt4 book ai didi

macos - 将鼠标光标更改为非事件 NSWindow

转载 作者:行者123 更新时间:2023-12-03 16:10:19 25 4
gpt4 key购买 nike

我有 NSWindow 的子类,并且有一个 MYWindow 类实现以下方法:

-(void)resetCursorRects {
NSImage *image = [NSImage imageNamed:@"cursor.png"];
[image setSize:NSMakeSize(32, 32)];
NSCursor *cursor = [[NSCursor alloc] initWithImage:image hotSpot:NSMakePoint(1, 1)];
[super resetCursorRects];
[self addCursorRect:[self bounds] cursor:cursor];
}

这将更改整个窗口的光标,我将看到cursor.png而不是默认的鼠标指针。问题是,只有当 MYWindow 设置为关键窗口时,这才有效,这当然是很重要的。

在我的项目开始时,我只有一个主窗口,但现在我需要有两个不同的 MYWindow。两个窗口的问题是无法将两者设置为关键窗口,因此自定义鼠标指针仅显示在事件窗口上。我需要单击另一个窗 Eloquent 能显示光标。

有什么办法可以解决这个问题吗?所以我在两个窗口上都得到了自定义光标?

编辑:尝试过 NSTrackingArea

我将其添加到内容 View 的 init 方法中:

self.trackingArea = [[NSTrackingArea alloc] initWithRect:[self frame] options: (NSTrackingCursorUpdate | NSTrackingActiveAlways | NSTrackingMouseMoved) owner:self userInfo:nil];
[self addTrackingArea:self.trackingArea];

然后我重写了cursorUpdate:,如下所示:

-(void)cursorUpdate:(NSEvent *)event {
NSLog(@"event : %@", event);
[[NSCursor crosshairCursor] set];
}

当包含 NSImageView 派生类的 NSWindow 是关键窗口时,这使得十字光标显示。但是,如果我在应用程序中创建另一个 NSWindow 作为关键窗口,光标将再次返回到标准光标。我做错了什么吗?

最佳答案

我在这个问题上挣扎了很长一段时间,我认为只有一种方法可以改变非事件应用程序上的鼠标光标(在非前台窗口上)。这是一种古怪而神奇的方式。

在调用相当标准之前:

[[NSCursor pointingHandCursor] push];

您必须调用:

void CGSSetConnectionProperty(int, int, int, int);
int CGSCreateCString(char *);
int CGSCreateBoolean(BOOL);
int _CGSDefaultConnection();
void CGSReleaseObj(int);
int propertyString, boolVal;

propertyString = CGSCreateCString("SetsCursorInBackground");
boolVal = CGSCreateBoolean(TRUE);
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, boolVal);
CGSReleaseObj(propertyString);
CGSReleaseObj(boolVal);

或者如果您使用的是 Swift:

将其放入您的 YourApp-Bridging-Header.h 中:

typedef int CGSConnectionID;
CGError CGSSetConnectionProperty(CGSConnectionID cid, CGSConnectionID targetCID, CFStringRef key, CFTypeRef value);
int _CGSDefaultConnection();

然后调用:

let propertyString = CFStringCreateWithCString(kCFAllocatorDefault, "SetsCursorInBackground", 0)
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue)

关于macos - 将鼠标光标更改为非事件 NSWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21652158/

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