Мой оригинальный ответ будет работать, только если окно было активным. Я также хотел, чтобы это работало, когда окно было скрыто, и предложил код, приведенный ниже.
Это работает для обычных клавиш (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;
}