2

第一个问题。如果需要,请帮助格式化它。

上下文
我在主窗体中有一个 TWebBrowser,它的行为就像打印机一样。
因此,当用户在真实打印机中执行一些命令时,我在其中加载了一些 HTML 文本……
我希望用户能够单击并从 WebBrowser 中选择文本。

问题
当用户在 WebBrowser 中单击时,从操作中注册的某些快捷方式不再起作用。例如,有一个带有快捷方式的操作F7。如果用户在 WebBrowser 中单击并按 F7,它不会调用我的快捷方式。
我知道这是 WebBrowser 的设计。

所以,我想:我想将每个组合键发送回表单。
问题是:如何?
如果它是另一个控件,我可以perform(WM_KeyDown,...)OnKeyDown事件中使用 a。

替代方案或建议也将不胜感激。这两天我很累,所以我可能会错过一些东西。

4

2 回答 2

4

IDocHostUIHandler通过实现或使用著名的EmbeddedWB派生 TWebBrowser

OnTranslateAccelerator使用调用的事件实现接口TranslateAccelerator

在您的浏览器实例上设置事件

像这样检测您的密钥:

function TBrowserPageIE.DoTranslateAccelerator(const lpMsg: PMSG; const pguidCmdGroup: PGUID; const nCmdID: DWORD): HRESULT;
begin
  result := S_FALSE;

  if lpMsg.message = WM_KEYDOWN then begin
    if lpMsg.wParam = VK_F7 then begin
      // do something here...
      result := S_OK;
    end;
  end;
end;
于 2011-04-27T07:24:16.873 回答
1

我测试和工作的一个选项是在 HTML/javascript 上捕获 key_code,然后使用更改文档标题将其发送到表单。我会把它放在这里希望对某人有所帮助...

您将需要添加 javascript 以捕获 HTML 页面标题中的键,如下所示:

<script = ''javascript''>
  function keypresed() {
    var tecla=window.event.keyCode;

    document.title = "Command"+tecla;
    event.keyCode=0;
    event.returnValue=false;
  }
  document.onkeydown=keypresed;
</script>

然后在 Webbrowser 中使用 onTitleChangeEvent 来使用密钥。

var
 s:string;
begin
  if Copy(Text,0,7) = 'Command' then
  begin
    //get the key...
    s:= Copy(Text,8,Length(Text));

    // if before the webbrowser get the focus edit1 was the focused control, you will need remove that focus first...
    dummy.setfocus; 
    edit1.setfocus;

    //perform keydown
    keybd_event(StrToInt(s), 1,0,0)
  end;
end;

好吧,这可以用来执行任何其他自定义命令。:)

于 2011-05-03T14:40:24.257 回答