2010-12-13 4 views
1

빈 빨간색 사각형이있는 간단한 응용 프로그램을 만들려고합니다. 마우스가 사각형의 상반부 테두리 위로 이동하면 커서가 닫힙니다.NSView가 마우스 이동 이벤트를 감지하지 못합니다.

나는 투명한 NSWindow을 만들고 그것으로 을 그 안에 넣었고, 마우스로 움직이는 이벤트를 받아들이도록 사각형을 만들었다. (방법 : -setAcceptsMouseMovedEvents). 나는 YES를 반환하기 위해 -canBecomeKeyWindow-canBecomeMainWindow 윈도우를 오버라이드했다. 그러나 어쨌든 이벤트 중 어느 것도 수신되지 않고 있습니다. NSView.

동일한 코드를 코코아 애플리케이션 프로젝트로 만들고 -applicationDidFinishLaunching 메서드에서 내 창을 만들면 내보기가 -mouseMoved 이벤트를 수신 할 수있었습니다.

왜 재단 명령 줄 유틸리티 프로젝트를 사용할 때 마우스가 이동 한 이벤트를받지 못합니까?

Foundation cmd line 유틸리티 프로젝트를 통해 창 (탄소 또는 코코아)을 만들 때마다 제목 표시 줄을 클릭해도 창은 핵심이되지 않습니다. 제목 표시 줄을 클릭하면 밝은 회색이 유지됩니다. 어두운 회색이되었다. 왜 이런 일이 일어나는 걸까요?

YES를 반환하기 위해 -canBecomeKeyWindow-canBecomeMainWindowNSwindow으로 대체했습니다.

답변

3

프로그램이 NSApplication을 시작하지 않기 때문에 이벤트를 감지하고 창에 전달하는 이벤트 루프가 없습니다. 일반적인 Cocoa 응용 프로그램의 main.m 파일을 참조하십시오.

이 방법을 사용하여 달성하려는 목표를 설명하는 것이 도움이 될 수 있습니다. 내 생각 엔 데몬을 만들고 있지만 GUI 인터페이스를 사용하여 "헤드리스"데몬을 관리하고 싶습니다. 새로운 로그인 관리 시스템을 구축하고 있습니다. 두 경우 모두 두 가지를 수행하는 특정 방법이 있으며 이는 그렇지 않습니다. :-)

+0

Joshua 내 view는 mouseDown 및 mouseDragged와 같은 다른 이벤트를 수신 할 수 있습니다. 유일한 문제는 mousesMoved 이벤트를 수신하는 것입니다. 사실 탄소 (C)에서 코코아 (Cocoa)로 응용 프로그램을 이전하려고합니다. 원래의 탄소 코드에서 사용되지 않았기 때문에 인터페이스 빌더 및 nib 파일을 사용할 수 없습니다. 투명한 캡처 창을 만들려고 할 때이 문제에 봉착했습니다. 사용자가 마우스 포인터를 사각형의 테두리 위로 이동하면 마우스 포인터가 closedHand로 바뀌어야 커서가 창을 이동할 수있는 사용자를 묘사합니다. –

+0

"제목 표시 줄을 클릭하면 짙은 회색이 아닌 밝은 회색이 유지됩니다." 문제는 여전히 남아 있습니다 : 당신은 윈도우 서버와 적절히 인터페이스하지 못하고 있습니다. 명령 줄 도구는이를위한 것이 아닙니다. 나는 새로운 Cocoa 응용 프로그램을 만드는 것이 더 낫고 적절한 Cocoa 디자인 패턴을 사용하여 응용 프로그램을 다시 빌드하는 것이 훨씬 낫다고 조언합니다. 기존 코드를 커맨드 라인 프로그램의 목구멍에 내려 놓음으로써 Carbon 어플리케이션의 직선 "포트"를 만들려고하는 고통의 세계 *를 요구하고 있습니다. 이것은 나쁜 충고보다 더 나쁩니다. –

13

나는 Joshua가 이미 말했던 것에 동의 할 것이다. 사용자 인터페이스를 보여줄 응용 프로그램은 무명 백그라운드 프로세스이거나 Dock에 표시되는 응용 프로그램 번들 형태 여야하며 Foundation 도구 템플리트처럼 일반적인 오래된 Mach-O 실행 파일이 아닙니다. 몹시 떠들어 대다.

또한, 뷰가 기본적으로 mouseMoved: 이벤트에 응답하지 않는 이유가있다 : 추적 영역으로

  1. 마우스 mouseMoved:을 사용하는 작은 이유는 일반적으로이 빠르게 이벤트 큐
  2. 홍수 수있는 이벤트 이동은, 보다 효과적이고 효율적인 입니다. 1000 개 행사에 약 20 초 결과 상위 뷰 주위에 마우스를 이동

    alt text

    :

A는 다시 동안, 나는이 두 방법의 차이점을 보여줍니다 약간의 테스트 응용 프로그램을 작성 추적 영역을 사용하는 하위보기에서는 50보다 작습니다.

샘플 GitHub의 프로젝트 : 여호수아가 언급 한 바와 같이 당신이 달성하려고하는 것을 설명 할 수 있다면 https://github.com/NSGod/MouseMoved-vs-TrackingAreas

다시 말하지만, 그것은 도움이 될 것입니다. 앱이 백그라운드 앱 (LSUIElement == 1)이어야하고 Dock에 표시되지 않고 인터페이스를 제공해야하는 경우,이를 수행 할 수있는 방법이 있습니다 (Josh가 언급했듯이 명령 줄이며 번들로 제공되지 않는 앱은 방법).

+0

샘플 코드를 보내 주셔서 감사합니다.이 작업에 매우 유용합니다 ... – gtmtg

관련 문제