2011-05-04 2 views
0

J'utilise avec succès Delph 7 et le contrôle ActiveX d'Adobe Reader version 7 pour extraire le numéro de page d'un document PDF ouvert hébergé dans le composant ActiveX (TAcroPDF). Je suis intéressé par la mise à niveau vers le dernier lecteur Adobe, mais quelque chose a changé dans Adobe Reader 8 (et 9) qui m'a empêché de mettre à jour (je n'ai pas testé Adobe 10/X). Avec Adobe 7, j'utilise la fonction Windows SDK EnumChildWindows pour rassembler les fenêtres enfants de mon formulaire contenant le composant TAcroPDF et trouver un contrôle avec le nom AVPageNumView, puis FindWindowEx pour obtenir son handle. Puis j'appelle SendMessage pour obtenir le texte de ce contrôle qui a l'information de numéro de page. Avec Adobe 8 et 9, fenêtre/contrôle AVPageNumView n'est plus là, il semble. Ainsi, je suis coincé dans Adobe 7 et cherche toujours un moyen d'obtenir le numéro de page, de préférence Adobe 9 ou 10/X. L'objectif serait de ne pas avoir à faire une réécriture complète avec une autre technologie, mais je suis ouvert à cela si c'est la seule solution.Obtention du numéro de page du document PDF à partir du contrôle ActiveX d'Adobe Reader

Merci, Michael

Répondre

0

Vous utilisez un nom WNDCLASS (AVPageNumView). Évidemment, le nom de la classe a changé dans la nouvelle version. Vous pouvez utiliser quelque chose comme WinDowse pour rechercher les fenêtres dans la version plus récente de Reader pour trouver les nouveaux noms de classe. Mettez à jour votre code pour d'abord vérifier l'ancien wndclass; Si ce n'est pas le cas, essayez de trouver le nouveau.

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; 
Questions connexes