c++ - vmly - Cómo deshabilitar VML en MSHTML
vmly&r (2)
Lo siento si esta respuesta no es perfecta, pero con la edad de la pregunta y la cantidad de gente interesada, 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. Si coloca múltiples 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.
Deberá 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 necesita 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 múltiples formatos de portapapeles después de copiar desde Word, simplemente puede 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.
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.
Si elimino el registro de VML Dll (regsvr32 -u "% ProgramFiles% / Common Files / Microsoft Shared / VGX / vgx.dll), entonces el control se comporta de la manera que quiero y descarta el VML y conserva el HTML.
No he podido establecer una forma programática de decir a MSHTML que no quiero el VML sino el HTML. ¿Algunas ideas?
Una solución compleja: la llamada a la clave de redireccionamiento de enlace devuelve un valor falso para HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Internet Explorer/Version Vector
VML
value.
Código de muestra:
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);
}
Pase de prueba de Windows 8.1 + WORD 2007, pero será mejor que recurra a eliminar las etiquetas de VML.
Ruta clave desde el identificador de clave desde: Determine la ruta a la clave de registro desde el manejador HKEY en C ++