2014-11-08 207 views
0

如何解決以下錯誤,看來他無法找到函數AccessibleObjectFromEvent。 我使用的是Delphi XE6版本。Delphi中的未聲明標識符AccessibleObjectFromEvent

該項目在您的瀏覽器上激活您的URL。

圖片

enter image description here

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. 
+4

在您提出問題並收到答案後,積極修正您自己的問題,這違背了StackOverflow的精神。因此,我已經回滾了您的編輯。 – Compass 2014-11-12 15:42:26

回答

2

功能AccessibleObjectFromEventOleacc.dll一部分,用它定義添加到您的聲明。

function AccessibleObjectFromEvent(hWnd   :HWND; 
            dwObjewctID  :DWORD; 
            dwChildID  :DWORD; 
            out pAcc  :IAccessible; 
            out pVarChild :OleVariant 
            ):HResult; stdcall; external 'OLEACC.DLL';