次のエラーを解決するにはどうすればよいですか。関数 AccessibleObjectFromEvent が見つからないようです。バージョン Delphi XE6 を使用しています。
このプロジェクトは、ブラウザでアクティブな URL を一覧表示します。
画像
http://i.imgur.com/2JbiIR7.png
これが私のコードです:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure AddUrlToMemo;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
{ MSAAIntf, } Oleacc, ActiveX;
{$R *.dfm}
type
HWINEVENTHOOK = THandle;
var
UrlVelha: WideString;
Thread: THandle = 0;
ThreadId: DWORD = 0;
procedure WinEventProc(hWinEventHook: HWINEVENTHOOK; event: DWORD; hwnd: HWND;
idObject, idChild: Longint; idEventThread, dwmsEventTime: DWORD); stdcall;
var
vAccObj: IAccessible;
varChild: OleVariant;
vWSName, vWSValue: WideString;
ClassName: String;
Acesso: HResult;
begin
SetLength(ClassName, 255);
SetLength(ClassName, GetClassName(hwnd, PChar(ClassName), 255));
if (ClassName = 'Chrome_WidgetWin_1') then
begin
Acesso := AccessibleObjectFromEvent(hwnd, idObject, idChild, vAccObj, varChild);
If (Acesso = S_OK) and (vAccObj <> nil) then
begin
vAccObj.Get_accName( { CHILDID_SELF } varChild, vWSName);
if (vWSName = 'Address and search bar') then
begin
vAccObj.Get_accValue( { CHILDID_SELF } varChild, vWSValue);
if (vWSValue <> '') and (vWSValue <> '<null>') and (UrlVelha <> vWSValue) then
begin
UrlVelha := vWSValue;
TThread.Synchronize(nil, Form1.AddUrlToMemo);
end;
end;
end;
end;
end;
function Thread_Infinite(param: Pointer): DWORD; stdcall;
var
Msg: TMSG;
vHook: HWINEVENTHOOK;
begin
CoInitialize(nil);
vHook := SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_VALUECHANGE, 0,
@WinEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
if (vHook <> 0) then
UnhookWinEvent(vHook);
CoUninitialize;
Result := 0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Thread := CreateThread(nil, 0, @Thread_Infinite, nil, 0, ThreadId);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if (ThreadId <> 0) then
PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
if (Thread <> 0) then
begin
repeat
if (WaitForSingleObject(Thread, 5000) <> WAIT_TIMEOUT) then
Break;
CheckSynchronize;
until False;
CloseHandle(Thread);
end;
end;
procedure TForm1.AddUrlToMemo;
begin
if (Memo1 <> nil) and (not (csDestroying in ComponentState)) then
Memo1.Lines.Add(UrlVelha);
end;
end.