0

Delph 7 と Adob​​e Reader バージョン 7 の ActiveX コントロールを使用して、ActiveX コンポーネント (TAcroPDF) に格納されている開いている PDF ドキュメントからページ番号を抽出することに成功しています。最新の Adob​​e Reader へのアップグレードに関心がありますが、Adobe Reader 8 (および 9) で何かが変更されたため、アップグレードできませんでした (Adobe 10/X はテストしていません)。Adobe 7 では、Windows SDK 関数 EnumChildWindows を使用して、TAcroPDF コンポーネントを含むフォームの子ウィンドウを収集し、AVPageNumView という名前のコントロールを見つけてから、FindWindowEx を使用してそのハンドルを取得します。次に、SendMessage を呼び出して、ページ番号情報を持つコントロールのテキストを取得します。Adobe 8 および 9 では、ウィンドウ/コントロール AVPageNumView は存在しないようです。したがって、私はAdobe 7で立ち往生しており、できればAdobe 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 に答える