Вместо того, чтобы обходиться с CGDisplayHideCursor, с его таинственным нечитаемым количеством скрытий, решение состоит в том, чтобы установить прямоугольник курсора, покрывающий все ваше окно прозрачным курсором. Это действительно надежно - оно надежно скрывает курсор, когда мышь находится внутри окна, и показывает его в любое другое время.
Я в конце концов понял это, посмотрев на исходный код Simple DirectMedia Layer (SDL) 2 - вот рабочий минимальный пример, извлеченный из него.
Переопределить resetCursorRects в вашей реализации подкласса NSView:
static NSCursor* invisibleCursor()
{
static NSCursor *invisibleCursor = NULL;
if (!invisibleCursor) {
/* RAW 16x16 transparent GIF */
static unsigned char cursorBytes[] = {
0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x10, 0x00, 0x10, 0x00, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xF9, 0x04,
0x01, 0x00, 0x00, 0x01, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x10,
0x00, 0x10, 0x00, 0x00, 0x02, 0x0E, 0x8C, 0x8F, 0xA9, 0xCB, 0xED,
0x0F, 0xA3, 0x9C, 0xB4, 0xDA, 0x8B, 0xB3, 0x3E, 0x05, 0x00, 0x3B
};
NSData *cursorData = [NSData dataWithBytesNoCopy:&cursorBytes[0]
length:sizeof(cursorBytes)
freeWhenDone:NO];
NSImage *cursorImage = [[[NSImage alloc] initWithData:cursorData] autorelease];
invisibleCursor = [[NSCursor alloc] initWithImage:cursorImage
hotSpot:NSZeroPoint];
}
return invisibleCursor;
}
- (void)resetCursorRects
{
[super resetCursorRects];
[self addCursorRect:[self bounds] cursor:invisibleCursor()];
}