Tastatureingabe systemweit ignorieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ok, erstmal das Wichtigste vorweg:
    Kann man aus einem CGEvent auslesen, welche Funktionstaste genau gedrückt wurde? ich will die "lauter machen"-Taste genau von der "leiser machen"-Taste unterscheiden können. Wenn ich diese Unterscheidung nicht machen kann, hat sich das mit den CGEvents auch schon wieder erledigt :(
    edit: Habe jetzt viel mit der Funktion CGEventGetIntegerValueField() probiert, aber es scheint für CGEvents einfach kein Feld zu geben, welches die gesuchte Information enthält...
    ----------------------------------------------------------------------------
    Folgendes nur lesen falls obiges bejat werden kann:

    Ich habe jetzt mal was mit Event Taps gemacht.

    Quellcode

    1. CFMachPortRef myEventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, [b]kCGEventMaskForAllEvents[/b], MyEventTapCallBack, &myRefferenceData);


    Wenn ich als Event-Filter kCGEventMaskForAllEvents eintrage, dann wird auch wirklich bei allen Events die CallBack-Methode aufgerufen.
    Allerdings interessieren mich eigentlich nur die Funktionstasten (z.B. "lauter machen Taste gedrückt", "dunkler machen", usw.).
    Ich dachte, möglicherweise zählt man die ja noch zu den keyDownEvents und habe es dann halt mit kCGEventKeyDown als Event-Filter versucht.
    Da stoße ich auf folgendes Problem: kein einziges KeyDown-Event sorgt für den Aufruf der CallBack-Methode. Mausklicks hingegen lösen sehr wohl den CallBack Aufruf aus. Also irgendwas ist da doch verkehrt.

    Hier mal der ganze Code falls der was bringen sollte:

    Quellcode

    1. CFRunLoopSourceRef mySource;
    2. CGEventRef MyEventTapCallBack (
    3. CGEventTapProxy proxy,
    4. CGEventType type,
    5. CGEventRef event,
    6. void *refcon
    7. )
    8. {
    9. // buchstabend der Tastatur bekommen:
    10. UniChar wolfgang;
    11. UniCharCount aCount;
    12. CGEventKeyboardGetUnicodeString(event, 1, &aCount, &wolfgang);
    13. printf("%C\n", wolfgang);
    14. return event;
    15. }
    16. int myRefferenceData;
    17. - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    18. {
    19. // hier wird der tap nun erstellt
    20. CFMachPortRef myEventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, kCGEventKeyDown, MyEventTapCallBack, &myRefferenceData);
    21. CGEventTapEnable(myEventTap, true);
    22. mySource = CFMachPortCreateRunLoopSource(NULL, myEventTap, 0);
    23. //tap nun zur runloop adden:
    24. CFRunLoopAddSource(CFRunLoopGetMain(), mySource, kCFRunLoopCommonModes);
    25. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von DrUeSBe ()

  • Hab die Nuss jetzt endlich geknackt...

    Quellcode

    1. NSEvent* myEvent = [NSEvent eventWithCGEvent:event];
    2. NSLog(@"hoffentlich: %ld", myEvent.data1);


    Fuck Yeahhh

    PS: Das mit dem Event-Filter ist immernoch unklar. Gut wäre halt ein funktionierender Event-Filter für system definierte Events.
    Aber zumindest an "das fehlende Feld" bei CGEvents konnte ich nun doch herankommen.
  • ich möchte aber, dass die CallBack nur bei ganz bestimmten Events aufgerufen wird. Ich glaub das heißt Event-Mask und nicht Event-Filter. Sry wenn das unklar war.

    CFMachPortRef CGEventTapCreate (
    CGEventTapLocation tap,
    CGEventTapPlacement place,
    CGEventTapOptions options,
    CGEventMask eventsOfInterest,<-Die hier meinte ich
    CGEventTapCallBack callback,
    void *refcon
    );

    Mich interessieren ja nur ein paar Tastatur-/systemdefinierte- Events, aber aktuell wird die CallBack bei jeder kleinsten Mausbewegung aufgerufen, sodass meine App immer nahezu genausoviel Leistung zieht wie der WindowServer (obwohl die Funktion natürlich sofort eine if Abfrage macht und dann auch sofort returnt, ohne sonst etwas zu machen).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DrUeSBe ()