2012-08-02 2 views
1

저는 Carbon 및 Cocoa 비트를 사용하여 Windows 용으로 작성된 일부 C++ 코드를 처리하는 응용 프로그램을 만들고 있습니다. 나는 현재 사용자가 cmd + 탭을 창 밖으로 드래그하거나 도킹 위로 마우스를 움직일 때 (Cockoa NSCursor 클래스를 사용하여 커서를 도크의 아무 곳에서나 앱의 아이콘이 아닌) 가리킬 때 문제가 발생합니다.)가 사용자 정의 커서에서 일반 OS X 커서로 바뀝니다.탄소/코코아 도킹 이벤트 이상

기본적으로 사용자가 도크를 가리키면 앱에 전송되는 정보 (Carbon과 Cocoa 모두)를 아는 사람이 있습니까?

+0

이 코드는이 작업을 수행하는 방법을 발견 추가 할 수 있습니까? –

+0

현재 코드에서 커서가 정확히 어떻게 변경 되었습니까? 필자의 경우'NSView' 서브 클래스에서'resetCursorRects' 메소드를 구현하면 (뷰의'bounds'에서'addCursorRect : cursor :'를 호출하는 것만으로도 충분합니다); 커서 모양 자체를 복원합니다. –

답변

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)