2011-05-04 477 views
0

我成功使用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来获取具有页码信息的那个控件的文本。使用Adobe 8和9,窗口/控件AVPageNumView不再存在。因此,我陷入了Adobe 7,仍在寻找获取页码的方法,最好是Adobe 9或10/X。我们的目标是不必用其他技术进行完全重写,但如果它是唯一的解决方案,我很乐于接受。从Adobe Reader的ActiveX控件获取PDF文档的页码

感谢, 迈克尔

回答

0

您使用的是WNDCLASS名称(AVPageNumView)。显然,新版本中的类名已经更改。您可以使用WinDowse之类的东西来调查较新版本的Reader中的窗口,以查找新的类名。更新你的代码首先检查旧的wndclass;如果找不到,请尝试找到新的。

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; 
相关问题