Ярлык меню потребляет события - PullRequest
0 голосов
/ 30 ноября 2018

Я использую CMD-C для своего пользовательского действия COPY, которое использует ярлык COPY также для обычного редактирования текстового поля.Я хочу сохранить стандартную CMD-C копию в буфер обмена, когда текстовое поле имеет фокус и редактирует.Как мне это сделать?

1 Ответ

0 голосов
/ 30 ноября 2018

Мне удалось перехватить события ярлыков меню, но я борюсь с правильной маршрутизацией события onKey к текущему textRield firstResponder.

Код ниже работает, но я не совсем доволен этим.Смотрите комментарии там.Этот метод перезаписывает исходный в NSApplication.

- (void) sendEvent:(NSEvent*)event
{
    id fr = NSApplication.sharedApplication.keyWindow.firstResponder;
    if (fr == nil || [fr isKindOfClass:NSTextView.class] == NO) {
        [super sendEvent:event];
        return;
    }
    NSTextView *tf = (NSTextView*)fr;
    if (!tf.editable || !tf.isEditable) {
        [super sendEvent:event];
        return;
    }

    // <REF> https://stackoverflow.com/a/3176930/929170
    //
    if ([event type] == NSEventTypeKeyDown) {
        if (([event modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask) == NSEventModifierFlagCommand) {
            if ([[event charactersIgnoringModifiers] isEqualToString:@"x"]) {
                if ([self sendAction:@selector(cut:) to:nil from:self])
                    return;
            }
            else if ([[event charactersIgnoringModifiers] isEqualToString:@"c"]) {
                if ([self sendAction:@selector(copy:) to:nil from:self])
                    return;
            }
            else if ([[event charactersIgnoringModifiers] isEqualToString:@"v"]) {
                if ([self sendAction:@selector(paste:) to:nil from:self])
                    return;
            }
            else if ([[event charactersIgnoringModifiers] isEqualToString:@"z"]) {
                if ([self sendAction:@selector(undo:) to:nil from:self])
                    return;
            }
            else if ([[event charactersIgnoringModifiers] isEqualToString:@"a"]) {
                if ([self sendAction:@selector(selectAll:) to:nil from:self])
                    return;
            }
        }
        else if (([event modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask) == (NSEventModifierFlagCommand | NSEventModifierFlagShift)) {
            if ([[event charactersIgnoringModifiers] isEqualToString:@"Z"]) {
                if ([self sendAction:@selector(redo:) to:nil from:self])
                    return;
            }
        }
    }

    // <C> this likely takes care of routing all the standard events (e.g. select word) EXCEPT clipboard actions;
    // Don't know why the clipboard events are not handled but the code above takes care of it.
    // Some event might however be lost...
    //
    [NSApplication.sharedApplication.keyWindow sendEvent:event];

    // <C> super is already handled above;
    //[super sendEvent:event];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...