开发者

mouse moved events are not detected by NSView

开发者 https://www.devze.com 2023-01-30 11:43 出处:网络
I am trying to make a simple application in which there is a empty red rectangle and whenever the mouse is moved over the upper half border of the rectangle the cursor will become closed hand.

I am trying to make a simple application in which there is a empty red rectangle and whenever the mouse is moved over the upper half border of the rectangle the cursor will become closed hand.

I started with selecting the foundation command line project.Made a transparent NSWindow and embedded a NSView in it with the rectangle, made window to accept mouse moved events(by method: -setAcceptsMouseMovedEvents). I have overridden -canBecomeKeyWindow and -canBecomeMainWindow 开发者_运维问答window to return YES. But somehow none of the -mouseMoved events are being received by NSView.

When I put the same code by making a cocoa application project and creating my window in -applicationDidFinishLaunching method , my view was able to receive -mouseMoved events.

why is it not receiving mouse moved events when I use foundation command line utility project ?

I have also observed that whenever I make a window(carbon or cocoa) through foundation cmd line utility project , the window doesn't become key even on clicking the title bar.On clicking the title bar color remains light grey instead of becoming dark grey. Why is this happening?

I have overridden -canBecomeKeyWindow and -canBecomeMainWindow of NSwindow to return YES.


I would agree with what Joshua has already said. Any application that is going to show a user interface, be it a faceless background process or one which shows up in the Dock, should be in the form of an application bundle, not a plain old Mach-O executable like the Foundation tool template will create.

Also, there are reasons why views do not respond to mouseMoved: events by default:

  1. Mouse moved events can quickly flood the event queue
  2. There is generally little reason to use mouseMoved:, as tracking areas are far more effective and efficient.

A while back, I wrote a little test app that demonstrates the differences between these 2 approaches:

mouse moved events are not detected by NSView

Moving your mouse around the upper view for roughly 20 seconds results in 1000 events, while in the lower view, which uses tracking areas, less than 50.

Sample GitHub project: https://github.com/NSGod/MouseMoved-vs-TrackingAreas

Again, as Joshua mentioned, it would be helpful if you could describe what you're trying to accomplish. If your app needs to be a background app (LSUIElement == 1), and present an interface without appearing in the Dock, then there are ways to do that (as Josh mentioned, a command-line, non-bundled app is not the way).


You have no event loop to detect events and pass them to your window because your program does not start an NSApplication. See the main.m file of a typical Cocoa application.

It might be helpful to describe what you're trying to accomplish by taking this approach. My guess is you're building a daemon but want a GUI interface to manage the otherwise "headless" daemon. That or you're building a new login management system. In either case, there are specific ways to do both and this isn't it. :-)

0

精彩评论

暂无评论...
验证码 换一张
取 消