Как отправить ключевые события во флэш-фильм в WebKit? - PullRequest
1 голос
/ 24 января 2010

Я пытаюсь создать браузерное приложение для конкретного сайта. Я создал новое приложение Cocoa, добавил в окно WebView и загружаю страницу. Страница содержит Flash-ролик, которым можно управлять с помощью клавиатуры. Я хотел бы подключить некоторые команды меню для запуска действий, предположительно путем имитации нажатия клавиш.

Я просмотрел иерархию представлений и нашел NSView, который содержит фильм (с именем класса «WebHostedNetscapePluginView»). Но я застрял в момент отправки ключей. Я попытался использовать CGEventCreateKeyboardEvent (), но входные данные продолжают поступать в веб-представление верхнего уровня, а не в подвид, содержащий фильм.

Я попытался [[окно веб-просмотра] makeFirstResponder: _myView] установить цель для ввода.

Является ли CGEventCreateKeyboardEvent () правильной функцией здесь, и если да, то как мне получить ее для моего целевого NSView?

Заранее большое спасибо.

Ответы [ 3 ]

1 голос
/ 17 августа 2010

Мой оригинальный ответ будет работать, только если окно было активным. Я также хотел, чтобы это работало, когда окно было скрыто, и предложил код, приведенный ниже.

Это работает для обычных клавиш (Enter, Пробел, клавиши со стрелками и т. Д.). Он использует коды клавиш, поэтому он не будет работать с буквами и символами, которые могут перемещаться в зависимости от языка и региона пользователя.

И он не обрабатывает клавиши-модификаторы, такие как Command. Если кто-то может понять, , что , я с радостью предоставлю им кредит на ответ на этот вопрос.

// For Safari 4.x+
if ([[flashView className] isEqual:@"WebHostedNetscapePluginView"]) 
{
    CGEventRef event = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)keycode, true);
    [flashView keyDown:[NSEvent eventWithCGEvent:event]];
    CFRelease(event);
}
else 
{
    EventRecord event;
    event.what      = keyDown; 
    event.message   = keycode << 8;
    event.modifiers = 0;

     // For Safari 3.x
    if ([flashView respondsToSelector:@selector(sendEvent:)]) {
        [(id)flashView sendEvent:(NSEvent*)&event];
        event.what = keyUp;
        [(id)flashView sendEvent:(NSEvent*)&event];
    }

    // For Safari 4.x
    else if ([(id)flashView respondsToSelector:@selector(sendEvent:isDrawRect:)]) {
        [(id)flashView sendEvent:(NSEvent *)&event isDrawRect:NO];
        event.what = keyUp;
        [(id)flashView sendEvent:(NSEvent *)&event isDrawRect:NO];          
    }
    else 
    {
        NSLog(@"ERROR: unable to locate event selector for Flash plugin");
    }
}

Сначала необходимо найти виджет Flash в браузере; передать свой WebView к этому.

- (NSView*)_findFlashViewInView:(NSView*)view 
{
    NSString* className = [view className];

    // WebHostedNetscapePluginView showed up in Safari 4.x,
    // WebNetscapePluginDocumentView is Safari 3.x.
    if ([className isEqual:@"WebHostedNetscapePluginView"] ||
        [className isEqual:@"WebNetscapePluginDocumentView"]) 
    {
        // Do any checks to make sure you've got the right player
        return view;
    }

    // Okay, this view isn't a plugin, keep going
    for (NSView* subview in [view subviews]) 
    {
        NSView* result = [self _findFlashViewInView:subview];
        if (result) return result;
    }

    return nil;
}
0 голосов
/ 26 января 2010

Мне удалось понять это. Вот код:

[[self window] makeFirstResponder:_tunerView];

CGEventRef e1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)49, true);
CGEventPost(kCGSessionEventTap, e1);
CFRelease(e1);

CGEventRef e2 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)49, false);
CGEventPost(kCGSessionEventTap, e2);
CFRelease(e2);  

окно - главное окно приложения. _tunerView - это WebHostedNetscapePluginView. Я устанавливал первый респондент, когда окно впервые открылось, это не сработало. Я должен установить его прямо перед отправкой ключей.

0 голосов
/ 24 января 2010

Убедитесь, что элемент Flash имеет (HTML) фокус клавиатуры?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...