Mausbewegung ohne click auf den View

  • Mausbewegung ohne click auf den View

    Hallo,
    die nächste "dumme" Frage:

    Mein Programm registriert per - (void)mouseEntered:(NSEvent *)event, dass die Maus über dem View ist. Aber der View registriert die Mausbewegung nur dann, wenn ich vorher darauf klicke (Focus ?). Wie kriege ich es auch ohne hin ?
  • RE: Mausbewegung ohne click auf den View

    Original von rml
    Aber der View registriert die Mausbewegung nur dann, wenn ich vorher darauf klicke (Focus ?). Wie kriege ich es auch ohne hin ?

    Probier mal:

    Quellcode

    1. [[myView window]setAcceptsMouseMovedEvents:YES];
    I would be embarrassed if they did not spy on me.
  • Danke, aber das ist es nicht, er akzeptiert ja die events.

    Klappt auch recht gut, aber er reagiert halt erst dann, wenn ich den Fokus auf dem View habe.
    Ich habe relativ viele NSViews nebeneinander. Ich möchte wissen, wann die maus über dem View ist - das klappt, aber die Mauspoition auf dem View bekomme ich nur dann raus, wenn ich den entsprechenden view angeklickt habe.

    EDIT:

    [ [self window] makeFirstResponder: self ]; im - (void)mouseEntered:(NSEvent *)event

    scheint das Problem zu lösen, ich hoffe, es ist der übliche weg für sowas.

    EDIT2:

    Das geht leider auch nicht, da zum Beispiel mein Editfeld dann den Focus verliert :(

    Jemand eine bessere Idee ?
  • das ist es wohl auch nicht, aber irgendwie scheint "addTrackingArea" in die richtige richtung zu gehen. mal schaun.

    mir ist aber nicht klar, wo der unterschied zwischen trackingrect (was nicht 100% geht) und addTrackingArea ist.
  • Du solltest Dir mal in Ruhe die Anleitung Cocoa Events durchlesen.
    Nachdem Du schon heraus gefunden hast, was dort steht, nämlich dass:
    The view must be the first responder.
    The view’s window must be sent a setAcceptsMouseMovedEvents: message with an argument of YES.
    sind Tastaturereignisse jetzt das Problem. Mehr dann wiederum hier.

    Vielleicht reicht schon das Überschreiben von 'canBecomeKeyView' in NSView.
    I would be embarrassed if they did not spy on me.
  • ich habe es teilweise schon gelesen.

    aber das problem war ja der fous, den zum beispiel ein test edit field nicht verlieren darf. solche dinge wie makefirstresponder dürfen daher scheinbar nicht gesetzt werden, da sonst der view den fokus erhält.

    die dinge wie "The view must be the first responder.
    The view’s window must be sent a setAcceptsMouseMovedEvents: message with an argument of YES." waren schon vor meiner frage klar,

    dennnoch komme ich bisher ausschliesslich mit der area weiter. also vermute ich mal, das das der einzige weg ist.

    danke euch :)
  • Mit Cocoa-Bordmitteln wirst Du da nicht weiter kommen. Mit Quartz Event Services kann man sich per Event Tap in den globalen Eventstrom einklinken, in etwa so:

    Quellcode

    1. CGEventRef MyCallback (CGEventTapProxy proxy,
    2. CGEventType type,
    3. CGEventRef event,
    4. void *refcon) {
    5. CGPoint loc = CGEventGetLocation(event);
    6. MyAppDelegate* caller = (MyAppDelegate*)refcon;
    7. [caller globalMouseMoved:NSMakePoint(loc.x,loc.y)];
    8. return event;
    9. }
    10. @implementation MyAppDelegate
    11. - (void) applicationDidFinishLaunching:(id)arg {
    12. CFMachPortRef tapPort = CGEventTapCreate (kCGSessionEventTap,
    13. kCGHeadInsertEventTap,
    14. kCGEventTapOptionListenOnly,
    15. 1 << kCGEventMouseMoved,
    16. MyCallback,
    17. self);
    18. CFRunLoopSourceRef tapSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tapPort, 0);
    19. CFRunLoopRef runLoop = [[NSRunLoop currentRunLoop] getCFRunLoop];
    20. CFRunLoopAddSource(runLoop, tapSource, kCFRunLoopDefaultMode);
    21. }
    22. - (void) globalMouseMoved:(NSPoint)pt {
    23. NSLog(@"global mouse move to %f,%f",pt.x,pt.y);
    24. }
    Alles anzeigen
    Multigrad - 360°-Produktfotografie für den Mac
  • Vergiss alles, was bisher geschrieben wurde und mach es so:


    Quellcode

    1. - (void)mouseMoved:(NSEvent *)theEvent {
    2. NSLog(@"%@", NSStringFromSelector(_cmd));
    3. }
    4. - (void)updateTrackingAreas {
    5. while(self.trackingAreas.count > 0) {
    6. [self removeTrackingArea:[self.trackingAreas lastObject]];
    7. }
    8. [self addTrackingArea:[[NSTrackingArea alloc] initWithRect:self.bounds options:NSTrackingMouseMoved | NSTrackingActiveAlways owner:self userInfo:nil]];
    9. }


    Note: GC sollte genutzt werden.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Original von mattik
    Mit Cocoa-Bordmitteln wirst Du da nicht weiter kommen. Mit Quartz Event Services kann man sich per Event Tap in den globalen Eventstrom einklinken, in etwa so:

    Quellcode

    1. CGEventRef MyCallback (CGEventTapProxy proxy,
    2. CGEventType type,
    3. CGEventRef event,
    4. void *refcon) {
    5. CGPoint loc = CGEventGetLocation(event);
    6. MyAppDelegate* caller = (MyAppDelegate*)refcon;
    7. [caller globalMouseMoved:NSMakePoint(loc.x,loc.y)];
    8. return event;
    9. }
    10. @implementation MyAppDelegate
    11. - (void) applicationDidFinishLaunching:(id)arg {
    12. CFMachPortRef tapPort = CGEventTapCreate (kCGSessionEventTap,
    13. kCGHeadInsertEventTap,
    14. kCGEventTapOptionListenOnly,
    15. 1 << kCGEventMouseMoved,
    16. MyCallback,
    17. self);
    18. CFRunLoopSourceRef tapSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tapPort, 0);
    19. CFRunLoopRef runLoop = [[NSRunLoop currentRunLoop] getCFRunLoop];
    20. CFRunLoopAddSource(runLoop, tapSource, kCFRunLoopDefaultMode);
    21. }
    22. - (void) globalMouseMoved:(NSPoint)pt {
    23. NSLog(@"global mouse move to %f,%f",pt.x,pt.y);
    24. }
    Alles anzeigen


    Also Hallo erstmal in die Runde dies ist mein erster Post und ich würde gerne diesen alten Thread reaktivieren.

    Beim studieren von dem oben zitierten Code ist mir eine Sache aufgefallen. Bzw es hat sich eine Frage ergeben. Welche Rolle "kCGEventMouseMoved" spielt habe ich verstanden. Aber wozu dient das "1 <<"?

    Vielen Dank für die Hilfe im voraus.