IUIAutomation, чтобы получить текущую ссылку Mozilla Firefox версии 61?

Я всегда использовал этот код для отображения текущего URL в Mozilla Firefox, он работал несколько лет назад, но на самом деле текущая версия Firefox (61) больше не работает.

Затем, чтобы решить мою проблему, я сделал адаптацию этого кода, где используется имя (запоминание "заполнителя" html), которое появляется перед тем, как пользователь начинает вставлять адрес веб-сайта, в качестве базы поиска.

uses
 UIAutomationClient_TLB;

type
  TTargetWndInfo = record
    hWindow: Hwnd;
    ClassName: String;
  end;

  PTargetWndInfo = ^TTargetWndInfo;

function EnumVisbleNoOwnedWndProc(hWindow: Hwnd; lData: PTargetWndInfo)
  : BOOL; stdcall;

  function IsOwnedWindow(hWindow: Hwnd): Boolean;
  begin
    Result := GetWindow(hWindow, GW_OWNER) <> 0;
  end;

  function GetClassNameStr(hWindow: Hwnd): string;
  var
    Buffer: array [0 .. MAX_PATH - 1] of Char;
    Len: Integer;
  begin
    FillChar(Buffer, SizeOf(Buffer), #0);
    Len := GetClassName(hWindow, Buffer, Length(Buffer));
    if Len > 0 then
      Result := Buffer
    else
      Result := '';
  end;

var
  LClassName: String;
begin
  Result := True;
  if IsOwnedWindow(hWindow) then
    Exit;
  if not IsWindowVisible(hWindow) then
    Exit;

  LClassName := UpperCase(GetClassNameStr(hWindow));
  if LClassName = UpperCase(lData^.ClassName) then
  begin
    lData^.hWindow := hWindow;
    Result := False;
  end;
end;

function GetActiveURLMozFF: string;
var
  LWndInfo: TTargetWndInfo;
  LTargetWnd: Hwnd;
  LRootElement: IUIAutomationElement;
  LvarProp: OleVariant;
  LScope: TreeScope;
  LpCondition: IUIAutomationCondition;
  LfoundArray: IUIAutomationElementArray;
  Lfound: IUIAutomationElement;
  LStrSearch: WideString;
  Value: WideString;
  LiInter: IInterface;
  ValPattern: IUIAutomationValuePattern;
begin

  LWndInfo.ClassName := 'MozillaWindowClass';
  LWndInfo.hWindow := 0;

  EnumWindows(@EnumVisbleNoOwnedWndProc, lParam(@LWndInfo));
  LTargetWnd := LWndInfo.hWindow;
  if LTargetWnd = 0 then
    Exit;

  if UIAuto.ElementFromHandle(LTargetWnd, LRootElement) = S_OK then
  begin

    LStrSearch := 'Search with Google or enter address';
    TVariantArg(LvarProp).vt := VT_BSTR;
    TVariantArg(LvarProp).bstrVal := PWideChar(LStrSearch);
    UIAuto.CreatePropertyCondition(UIA_NamePropertyId, LvarProp, LpCondition);

    LScope := TreeScope_Element or TreeScope_Children or TreeScope_Subtree;

    LRootElement.FindAll(LScope, LpCondition, LfoundArray);
    LfoundArray.GetElement(1, Lfound);
  end;

  if Assigned(Lfound) then
  begin
    Lfound.GetCurrentPattern(UIA_ValuePatternId, LiInter);
    if Assigned(LiInter) then
    begin
      if LiInter.QueryInterface(IID_IUIAutomationValuePattern, ValPattern) = S_OK
      then
      begin
        ValPattern.Get_CurrentValue(Value);
        Result := Trim(Value);
      end;
    end;
  end;
end;

Этот способ не годится, потому что этот текст всегда изменяется практически во всех обновлениях, которые Firefox устанавливает автоматически.

Тогда как мне сделать так, чтобы не использовать текст ("заполнитель"), отображаемый в адресной строке, в качестве базы для получения активного URL Mozilla Firefox?

Спасибо.

0 ответов

Другие вопросы по тегам