2011-07-21 14 views
6

Estoy usando el control MSHTML en modo de edición. Cuando copio y pego cosas de la palabra a mi control, los controles de MSHTML eliminan el HTML estándar y mantienen el marcado de VML que no está muy bien respaldado.Cómo deshabilitar VML en MSHTML

Si doy de baja del VML DLL (regsvr32 -u "% Archivos de programa% \ Archivos comunes \ Microsoft Shared \ VGX vgx.dll \) entonces el control se comporta de la manera que yo quiero y descarta el VML y mantiene el código HTML.

No he podido una forma programática de decir a MSHTML que no quiero el VML sino el HTML. ¿Alguna idea?

+0

supongo que la alternativa sería aceptar que crea VML, pero ejecutarlo a través de una> herramienta de conversión VML- SVG después (por ejemplo http://sourceforge.net/ proyectos/vectorconverter /) – Spudley

Respuesta

1

Disculpe si esta respuesta no es perfecta, pero con la edad de la pregunta y cuántas personas están interesadas, pensé que podría tomar una foto y con suerte ayudar a alguien si no fuera por el OP.

No estoy seguro de cómo VML/Word maneja los datos del portapapeles. Hay varios formatos en el Portapapeles de Windows, uno con el HTML que desea y otro con el formato VML, entonces tiene suerte y esto debería funcionar. Si no, entonces tal vez podría usar esto para limpiar el código en insertar al menos.

Querrá consultar IDocHostUIHandler::TranslateAccelerator. Debe implementar IDocHostUIHandler si aún no lo está. Utiliza ICustomDoc::SetUIHandler para registrarlo, después de cargar el documento HTML (puede ser una página vacía si la usa).

Dentro de TranslateAccelerator necesitas ver nCmdID == IDM_PASTE. Se dispara antes de que el usuario pegue algo al control HTML, y puede modificar el contenido del portapapeles antes de que se produzca el pegado.

Puede usar algo como GetClipboardData (RegisterClipboardFormat ("Formato HTML")), para obtener el formato HTML del portapapeles. Puede usar SetClipboardData para reemplazar los datos del portapapeles.

Para su uso, si ve que hay varios formatos de portapapeles después de copiar de Word, puede simplemente eliminar uno de los formatos, el que no desea. De esta forma, cuando el control HTML complete el pegado, solo usará el formato que desee.

Tengo ejemplos de código si es necesario, pero son parte de un proyecto grande y usan la biblioteca VCL de Borland para algunas partes. Mi código busca el formato CF_BITMAP en el portapapeles y lo convierte a formato HTML utilizando un archivo PNG. De modo que los usuarios que pegan una captura de pantalla en el control obtienen una imagen PNG más pequeña en lugar de un gran archivo BMP. El concepto es casi lo mismo que lo que quieres.

0

Una solución compleja: la llamada de la llave de reenganche de gancho devuelve el valor falso para HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version VectorVML valor.

Código de ejemplo:

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); 
} 

paso de la prueba de Windows 8.1 + WORD 2007, pero será mejor que reserva para quitar las etiquetas VML.

ruta de la clave del identificador de clave de: Determine path to registry key from HKEY handle in C++