Delphi 从Adobe Reader的ActiveX控件获取PDF文档的页码

Delphi 从Adobe Reader的ActiveX控件获取PDF文档的页码,delphi,activex,delphi-7,adobe-reader,Delphi,Activex,Delphi 7,Adobe Reader,我正在成功地使用Delph 7和Adobe Reader版本7的ActiveX控件从ActiveX组件TAcroPDF中包含的打开的PDF文档中提取页码。我有兴趣升级到最新的Adobe reader,但Adobe reader 8和9中的某些更改阻止了我升级。我没有测试Adobe 10/X。对于Adobe 7,我使用Windows SDK函数EnumChildWindows收集包含TAcroPDF组件的表单的子窗口,并找到名为AVPageNumView的控件,然后FindWindowEx去拿它的

我正在成功地使用Delph 7和Adobe Reader版本7的ActiveX控件从ActiveX组件TAcroPDF中包含的打开的PDF文档中提取页码。我有兴趣升级到最新的Adobe reader,但Adobe reader 8和9中的某些更改阻止了我升级。我没有测试Adobe 10/X。对于Adobe 7,我使用Windows SDK函数EnumChildWindows收集包含TAcroPDF组件的表单的子窗口,并找到名为AVPageNumView的控件,然后FindWindowEx去拿它的手柄。然后我调用SendMessage获取包含页码信息的控件的文本。在Adobe8和Adobe9中,窗口/控件AVPageNumView似乎不再存在了。因此,我被困在Adobe7中,仍然在寻找获取页码的方法,最好是Adobe9或10/X。目标是不必使用其他技术进行完全重写,但如果这是唯一的解决方案,我愿意接受

谢谢,
Michael

您正在使用wndclass名称AVPageNumView。显然,新版本中的类名已更改。您可以使用类似的方法在较新版本的Reader中调查窗口,以找到新的类名。更新代码以首先检查旧wndclass;如果找不到,请尝试找到新的

function EnumWindowProc(pHwnd: THandle; Edit: Integer): LongBool; stdcall;
    function GetWindowTxt(gwtHwnd: THandle): string;
    var dWTextBuf: PChar;
        TextLen: Integer;
    begin
      TextLen := SendMessage(gwtHwnd, WM_GetTextLength, 0, 0);;
      dWTextBuf := StrAlloc(TextLen + 1);
      SendMessage(gwtHwnd, WM_GetText, TextLen + 1, Integer(dWTextBuf));
      Result := dWTextBuf;
      StrDispose(dWTextBuf);
    end;

    function GetClassNameTxt(gcnHwnd: THandle): string;
    var dWClassBuf: PChar;
    begin
      dWClassBuf := StrAlloc(1024);
      GetClassName(gcnHwnd, dWClassBuf, 1024);
      Result := dWClassBuf;
      StrDispose(dWClassBuf);
    end;

begin
  Result := LongBool(True);
  if (GetClassNameTxt(pHwnd) = 'AVL_AVView') and (GetWindowTxt(pHwnd) = 'AVPageView') then
  begin
    TEdit(Edit).Text :=  GetWindowTxt(FindWindowEx(pHwnd, 0, 'RICHEDIT50W', nil));
    Result := LongBool(False);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumChildWindows(AcroPDF1.Handle, @EnumWindowProc, LongInt(Edit1));
end;