【问题标题】:TChromium how to block middle mouse click on the links?TChromium 如何阻止鼠标中键点击链接?
【发布时间】:2013-08-07 08:57:35
【问题描述】:

如何阻止鼠标中键点击 TChromium 中的链接?
我想自己处理这个鼠标中键单击以在新选项卡中打开它,所以我需要在 TChromium 中阻止鼠标中键单击,然后钩住鼠标中键,然后在新选项卡中打开选定的链接。
我有这个默认功能:

function TCustomRenderProcessHandler.OnBeforeNavigation(const browser: ICefBrowser;
  const frame: ICefFrame; const request: ICefRequest;
  navigationType: TCefNavigationType; isRedirect: Boolean): Boolean;
begin
  Result:=False;
end;

但实际上它什么也没提供。
TNX

【问题讨论】:

  • 是的,它什么都不做,因为您应该返回 True 以取消导航,但我在 link to that event reference 之前发布了您,其中明确说明了这一点。尽管您没有表现出任何学习的努力,但这里有一个简短的proof of concept。但是我不是钩子专家,不知道有没有更好的时间来钩鼠标。
  • 证明无效,MiddleMouseOnBeforeNavigation 中始终等于False,但在Form1 中它可以正常工作。

标签: delphi delphi-xe3 tchromium chromium-embedded


【解决方案1】:

我是通过其他方式做到的。
@TLama,感谢快速工作的 Hook Function。
那么,我是怎么做到的:

    //@HOOK PROC
    function MouseProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    var
      HookStruct: TMouseHookStruct;
    begin
      HookStruct := PMouseHookStruct(lParam)^;

      if (nCode >= 0) then
      begin
        case wParam of
          WM_MBUTTONDOWN:
            Begin
              MiddleDown := True;
              LeftMouse := False;
            End;

          WM_LBUTTONDOWN:
            Begin
              MiddleDown := False;
              LeftMouse := True;
            End;

          WM_RBUTTONDOWN:
            Begin
              MiddleDown := False;
              LeftMouse := False;
            End;
        end;
      end;

      Result := CallNextHookEx(0, nCode, wParam, lParam);
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      If(MiddleDown) then
        Begin
          MiddleDown:=False;
          If(SelectedItem<>'') Then
            Form1.AddNewTab(SelectedItem,SelectedItem,'');
        End
      Else If(LeftMouse) then
        Begin
          LeftMouse:=False;
          If(SelectedItem<>'') Then
            FBrowsers[Current_FBrowser_Index].Load(SelectedItem);
        End;
    end;

function TCustomRenderProcessHandler.OnBeforeNavigation(const browser: ICefBrowser;
  const frame: ICefFrame; const request: ICefRequest;
  navigationType: TCefNavigationType; isRedirect: Boolean): Boolean;
begin

  if navigationType = NAVIGATION_LINK_CLICKED then
  begin
    Result := True;
  end
  else
    Result := False;
end;

所以,这就是它在我的 DCEF3 中的工作方式 :)
感谢大家的帮助!!!

【讨论】:

  • 您应该可以毫无问题地读取OnBeforeNavigation事件中MiddleDown全局变量的值。现在,普通鼠标点击和链接点击之间完全没有关系了。
  • 我通过这个If(SelectedItem&lt;&gt;'') Then 在click 和linkclick 之间建立了关系。我别无选择,MiddleDownOnBeforeNavigation 中始终等于False
  • 不在您在此处发布的代码中。我在 Delphi 7 和 XE3 中测试过的 pastebin 项目。在这两种情况下,它都按预期工作。
  • 我不想再讨论这个了。我已经在 Delphi 7 和 XE3 中使用最新的 CEF3 测试了该代码,并且它在两个版本中都有效......而且我什至看不出你无法在 OnBeforeNavigation 事件方法中读取该值的原因。
  • 好吧,我不知道为什么会这样,但它在 XE3 中的 DCEF3 中不起作用
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 2011-07-02
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
相关资源
最近更新 更多