0

我成功地使用 Delph 7 和 Adob​​e Reader 版本 7 的 ActiveX 控件从 ActiveX 组件 (TAcroPDF) 中打开的 PDF 文档中提取页码。我有兴趣升级到最新的 Adob​​e 阅读器,但 Adob​​e Reader 8(和 9)发生了一些变化,导致我无法升级(我没有测试过 Adob​​e 10/X)。在 Adob​​e 7 中,我使用 Windows SDK 函数 EnumChildWindows 来收集包含 TAcroPDF 组件的表单的子窗口,并找到一个名为 AVPageNumView 的控件,然后使用 FindWindowEx 来获取它的句柄。然后我调用 SendMessage 来获取具有页码信息的控件的文本。在 Adob​​e 8 和 9 中,窗口/控件 AVPageNumView 似乎不再存在。因此,我被困在 Adob​​e 7 中,仍在寻找获取页码的方法,最好是 Adob​​e 9 或 10/X。

谢谢,迈克尔

4

2 回答 2

0

您正在使用 wndclass 名称 ( AVPageNumView)。显然,新版本中的类名发生了变化。您可以使用WinDowse之类的工具来调查较新版本的 Reader 中的窗口,以找出新的类名。更新您的代码以首先检查旧的 wndclass;如果没有找到,请尝试找到新的。

于 2011-05-05T00:43:54.450 回答
0
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;
于 2017-12-21T08:02:50.350 回答