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?
Спасибо.