2011-05-04 480 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; 
相關問題