objective c - How do I send key events to a Flash movie in WebKit? -
i trying create site-specific browser application. i've created new cocoa app, added webview window, , loading page. page contains flash movie, can controlled via keyboard. i'd wire menu commands trigger actions, presumably simulating keystrokes.
i've traversed view hierarchy , have found nsview contains movie (with class name "webhostednetscapepluginview"). i'm stuck @ point of sending keys. tried using cgeventcreatekeyboardevent() input keeps going top-level webview rather subview containing movie.
i tried [[webview window] makefirstresponder: _myview] set target input.
is cgeventcreatekeyboardevent() right function here and, if so, how target nsview?
many in advance.
my original answer work if window active. wanted work when window hidden, , came code below.
this works ordinary keys (enter, space, arrow keys, etc.). uses keycodes won't work letters , symbols might move around based on user's language , region.
and doesn't handle modifier keys command. if can figure that out gladly give them credit answer question.
// 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; // safari 3.x if ([flashview respondstoselector:@selector(sendevent:)]) { [(id)flashview sendevent:(nsevent*)&event]; event.what = keyup; [(id)flashview sendevent:(nsevent*)&event]; } // 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 locate event selector flash plugin"); } }
you must first locate flash widget in browser; pass webview this.
- (nsview*)_findflashviewinview:(nsview*)view { nsstring* classname = [view classname]; // webhostednetscapepluginview showed in safari 4.x, // webnetscapeplugindocumentview safari 3.x. if ([classname isequal:@"webhostednetscapepluginview"] || [classname isequal:@"webnetscapeplugindocumentview"]) { // checks make sure you've got right player return view; } // okay, view isn't plugin, keep going (nsview* subview in [view subviews]) { nsview* result = [self _findflashviewinview:subview]; if (result) return result; } return nil; }
Comments
Post a Comment