Получение номера страницы документа PDF из элемента управления ActiveX Adobe Reader - PullRequest
0 голосов
/ 04 мая 2011

Я успешно использую Delph 7 и элемент управления ActiveX Adobe Reader версии 7 для извлечения номера страницы из открытого документа PDF, размещенного в компоненте ActiveX (TAcroPDF).Я заинтересован в обновлении до последней версии Adobe 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.Цель состоит в том, чтобы не делать полную переписку с другой технологией, но я открыт для этого, если это единственное решение.

Спасибо, Майкл

Ответы [ 2 ]

0 голосов
/ 21 декабря 2017
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;
0 голосов
/ 05 мая 2011

Вы используете имя класса wndclass (AVPageNumView). Очевидно, что имя класса изменилось в новой версии. Вы можете использовать что-то вроде WinDowse , чтобы исследовать окна в новой версии Reader, чтобы узнать имена новых классов. Обновите ваш код, чтобы сначала проверить старый wndclass; если он не найден, попробуйте найти новый.

...