gpt4 book ai didi

objective-c - 如何将关键事件发送到 WebKit 中的 Flash 影片?

转载 作者:行者123 更新时间:2023-12-03 17:17:53 26 4
gpt4 key购买 nike

我正在尝试创建一个特定于站点的浏览器应用程序。我创建了一个新的 Cocoa 应用程序,将 WebView 添加到我的窗口,然后加载页面。该页面包含一个Flash影片,可以通过键盘控制。我想连接一些菜单命令来触发操作,大概是通过模拟击键来触发。

我已经遍历了 View 层次结构并找到了包含电影的 NSView(类名“WebHostedNetscapePluginView”)。但我陷入了发送 key 的困境。我尝试使用 CGEventCreateKeyboardEvent() 但输入始终进入顶级 WebView,而不是包含电影的 subview 。

我尝试 [[webView window] makeFirstResponder: _myView] 设置输入目标。

CGEventCreateKeyboardEvent() 在这里是正确的函数吗?如果是,我如何将它获取到我的目标 NSView?

提前非常感谢。

最佳答案

我原来的答案只有在窗口处于事件状态时才有效。我还希望它在窗口隐藏时也能工作,并想出了下面的代码。

这适用于普通键(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;
}

关于objective-c - 如何将关键事件发送到 WebKit 中的 Flash 影片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2128235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com