Macos 如何将NSEvent*转发到WebView?
我有一个Macos 如何将NSEvent*转发到WebView?,macos,cocoa,webview,nsview,Macos,Cocoa,Webview,Nsview,我有一个WebView,它嵌入到音频插件的UI中。该插件在OSX上支持插件格式的主机范围内作为动态库运行 在大多数主机中,WebView工作正常,因为如果我加载了一个HTML文本输入字段,并且它具有焦点,那么它将正常接受所有文本输入 但是,在涉及Apple“cmd”键的特定主机组合中,文本输入字段会“拒绝”该键,并将其转发回包含WebView。如果我使用WebView的子类并覆盖NSView键下:,我可以确认这一点,如下所示: @interface MyWebView : WebView { }
WebView
,它嵌入到音频插件的UI中。该插件在OSX上支持插件格式的主机范围内作为动态库运行
在大多数主机中,WebView
工作正常,因为如果我加载了一个HTML文本输入字段,并且它具有焦点,那么它将正常接受所有文本输入
但是,在涉及Apple“cmd”键的特定主机组合中,文本输入字段会“拒绝”该键,并将其转发回包含WebView
。如果我使用WebView
的子类并覆盖NSView键下:
,我可以确认这一点,如下所示:
@interface MyWebView : WebView
{
}
@end
@implementation MyWebView
-(void)keyDown:(NSEvent *)event
{
NSLog(@"keyDown [%@]", [event characters]);
}
@end
在大多数主机中,keyDown:
在焦点文本输入字段中输入文本时从不被调用。在我的有问题的主机中,它会被任何涉及“cmd”键的组合键调用,导致以下调用堆栈:
#0 0x00000001255fdf45 in ::-[MyWebView keyDown:](NSEvent *) at /Users/../juce_mac_WebBrowserComponent.mm:181
#1 0x00007fffa554bb79 in forwardMethod ()
#2 0x00007fffafa5bb7a in -[WebFrameView keyDown:] ()
#3 0x00007fffa554bb79 in forwardMethod ()
#4 0x00007fffa554bb79 in forwardMethod ()
#5 0x00007fffa554bb79 in forwardMethod ()
#6 0x00007fffa56e97d6 in -[NSControl keyDown:] ()
#7 0x00007fffafa48835 in -[WebHTMLView keyDown:] ()
#8 0x00007fffa5cc333c in -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] ()
#9 0x00007fffa5cc1f7a in -[NSWindow(NSEventRouting) sendEvent:] ()
#10 0x00007fffa5b47518 in -[NSApplication(NSEvent) sendEvent:] ()
我可以做些什么来防止事件被输入字段拒绝,或者更好地理解为什么它只被传递回特定插件主机的包含视图
在最坏的情况下,是否可以强制将NSEvent
转发回HTML输入字段
更新
好的,我可以通过在我的keyDown方法中检查event-keyCode以一种黑客方式“修复”这个问题,对于我关心的事件(剪切/复制/粘贴),使用NSApplication-sendAction:to:from:
相应地处理事件。大概是这样的:
-(void)keyDown:(NSEvent *)event
{
SEL selector = nil;
switch ([event keyCode])
{
case 7:
selector = @selector(cut:);
break;
case 8:
selector = @selector(copy:);
break;
case 9:
selector = @selector(paste:);
break;
default:
break;
}
if (selector != nil)
{
[[NSApplication sharedApplication] sendAction:selector to:nil from:self];
}
}
不过,我更喜欢更通用的解决方案……您所说的“被网络视图拒绝”是什么意思?这些关键组合事件会发生什么,实际发生了什么?为什么“将N事件转发回WebView”会有帮助?您的实验表明事件正在到达WebView。正在调用您的
-keyDown:
方法。这一点很好。我更新了问题,希望能澄清这一点。基本上,我的意思是,如果我在WebView中输入一个加载的文本输入字段,cmd-compositions会被传递回WebView,而不是被输入字段使用。所有其他键都可以工作,只有当我的插件加载到一个特定主机时,问题才会出现。非常奇怪。你的插件工作的主机是否有一个带有标准快捷键的标准项目的编辑菜单?不工作的主机是否缺少这样的菜单/项目?好的,只是检查一下。对于工作的主机,如果我键入cmd-p,主机的编辑菜单将短暂高亮显示,然后剪贴板内容将粘贴到输入字段中。对于不工作的主机,主机的“编辑”菜单不会高亮显示,并且会调用“我的向下键”。因此,问题似乎更多地与按键未到达主机(主机拥有包含WebView的窗口)有关?这应该是cmd-v而不是cmd-p。。。