2011-07-21 4 views
6

J'utilise le contrôle MSHTML en mode édition. Lorsque je copie et colmate des éléments à partir de mon mot de contrôle, les contrôles MSHTML supprime le code HTML standard et conserve le balisage VML qui n'est pas très bien supporté.Comment désactiver VML dans MSHTML

Si je Désouscrivez les VML dll (regsvr32 -u « % ProgramFiles% \ Common Files \ Microsoft Shared \ VGX \ vgx.dll), le contrôle se comporte de la façon dont je veux et rejette le VML et maintient le HTML.

Je n'ai pas été en mesure de dire à MSHTML que je ne veux pas le VML, mais le HTML.Toutes les idées?

+0

Je suppose que l'alternative serait d'accepter que cela crée VML, mais l'exécuter à travers un outil de conversion VML-> SVG après (par exemple http://sourceforge.net/ projets/vectorconverter /) – Spudley

Répondre

1

Désolé cette réponse n'est pas parfaite, mais avec l'âge de la question et combien de personnes sont intéressées, je pensais que je prendrais une photo et j'espère aider quelqu'un si ce n'est l'OP

Je ne sais pas comment VML/Word gère les données du presse-papiers. Ces formats multiples dans le Presse-papiers Windows, l'un avec le HTML que vous voulez, et l'autre avec le format VML, alors vous avez de la chance et cela devrait fonctionner. Si non, alors peut-être que vous pourriez utiliser cela pour nettoyer le code sur insérer au moins. Vous aurez besoin de IDocHostUIHandler::TranslateAccelerator. Vous devez implémenter IDocHostUIHandler si vous ne l'avez pas déjà fait. Vous utilisez ICustomDoc::SetUIHandler pour l'enregistrer, après que le document HTML est chargé (peut être une page vide si vous l'utilisez).

À l'intérieur TranslateAccelerator vous devez regarder nCmdID == IDM_PASTE. Ceci est déclenché avant que l'utilisateur ne colle quelque chose au contrôle HTML, et vous pouvez modifier le contenu du presse-papiers avant que le collage ne se produise.

Vous pouvez utiliser quelque chose comme GetClipboardData (RegisterClipboardFormat ("Format HTML")), pour obtenir le format HTML à partir du presse-papiers. Vous pouvez utiliser SetClipboardData pour remplacer les données du Presse-papiers. Pour votre utilisation, si vous voyez qu'il existe plusieurs formats de Presse-papiers après avoir copié à partir de Word, vous pouvez simplement supprimer l'un des formats, celui que vous ne voulez pas. De cette façon, lorsque le contrôle HTML termine le collage, il utilisera uniquement le format que vous voulez.

J'ai des exemples de code si nécessaire, mais ils font partie d'un grand projet et utilisent la bibliothèque VCL de Borland pour certaines parties. Mon code vérifie le format CF_BITMAP dans le Presse-papiers et convertit au format HTML en utilisant un fichier PNG à la place. Pour que les utilisateurs qui collez une capture d'écran sur le contrôle obtiennent une image PNG plus petite au lieu d'un fichier BMP énorme. Le concept est à peu près le même que ce que vous voulez.

0

Une solution complexe: Hook reigster appel clé retour valeur false pour HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version VectorVML valeur.

Exemple de code:

typedef DWORD(__stdcall *NtQueryKeyType)(
    HANDLE KeyHandle, 
    int KeyInformationClass, 
    PVOID KeyInformation, 
    ULONG Length, 
    PULONG ResultLength); 
NtQueryKeyType sNtQueryKeyPtr = NULL; 

std::wstring GetKeyPathFromKKEY(HKEY key) 
{ 
    std::wstring keyPath; 
    if (sNtQueryKeyPtr != NULL) { 
     DWORD size = 0; 
     DWORD result = 0; 
     result = sNtQueryKeyPtr(key, 3, 0, 0, &size); 
     if (result == STATUS_BUFFER_TOO_SMALL) { 
      size = size + 2; 
      wchar_t* buffer = new (std::nothrow) wchar_t[size/sizeof(wchar_t)]; // size is in bytes 
      if (buffer != NULL) 
      { 
       result = sNtQueryKeyPtr(key, 3, buffer, size, &size); 
       if (result == STATUS_SUCCESS) 
       { 
        buffer[size/sizeof(wchar_t)] = L'\0'; 
        keyPath = std::wstring(buffer + 2); 
       } 
       delete[] buffer; 
      } 
     } 
    } 
    return keyPath; 
} 

DWORD __stdcall VWMLNtQueryKey(
    HANDLE KeyHandle, 
    int KeyInformationClass, 
    PVOID KeyInformation, 
    ULONG Length, 
    PULONG ResultLength) { 
    auto str = GetKeyPathFromKKEY((HKEY)KeyHandle); 
    if (!str.empty() && base::StringProcess::endsWith(str, L"Internet Explorer\\Version Vector")) 
     return STATUS_INVALID_PARAMETER; 
    return sNtQueryKeyPtr(KeyHandle, KeyInformationClass, KeyInformation, Length, ResultLength); 
} 

base::WindowsDllInterceptor ntHook; 
ntHook.Init("ntdll.dll"); 
if (!ntHook.AddHook("NtQueryKey", reinterpret_cast<intptr_t>(&VWMLNtQueryKey), 
    (void**)&sNtQueryKeyPtr)) { 
    removeVMLTags(&html); 
} 

Test Réussi de Windows 8.1 + WORD 2007, mais vous feriez mieux de fallback pour enlever VML Tag.

chemin clé de la poignée clé: Determine path to registry key from HKEY handle in C++