微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在MSHTML中禁用VML

我在编辑模式下使用MSHTML控件。 当我从word复制并粘贴东西到我的控件时,MSHTML控件剥离标准的HTML并保持VML标记,但是在那里没有很好的支持

如果我取消注册VML Dll(regsvr32 -u“%ProgramFiles% Common Files Microsoft Shared VGX vgx.dll),那么控件的行为就是我想要的,并放弃VML并保留HTML。

我还没有能够通过编程的方式告诉MSHTML我不想使用VML,而是使用HTML。 有任何想法吗?

分布式列表中的冲突解决

如何使一个互斥体的3个进程自动交换?

检测打开的文件上的文件删除

Windows程序编译器警告(MinGW-w64)

文件被复制到SysWOW64而不是System32

集成的Windows身份validationWininet

等待指定的时间而不使用C

主板ID – WMI C ++ – 可靠吗?

可以启用在Cygwinterminal运行非Cygwin应用程序的死后debugging吗?

如何在Windows中设置光标位置?

对不起,如果这个答案不是完美的,但是问题的年龄和有多少人感兴趣,我想我会拍一些,如果不是OP,希望能帮助别人。

我不确定VML / Word如何处理剪贴板数据。 如果它在Windows剪贴板中放置了多种格式,一种是你想要的HTML,另一种是VML格式,那么你很幸运,这应该工作。 如果没有,那么也许你可以用它来清理插入代码至少。

你会想看看IDocHostUIHandler :: TranslateAccelerator 。 如果你还没有,你需要实现IDocHostUIHandler。 加载HTML文档后,使用ICustomDoc :: SetUIHandler进行注册(如果使用的话,可以是空白页面)。

在TranslateAccelerator里面,你需要注意nCmdID == IDM_PASTE 。 在用户将某些内容粘贴到HTML控件之前,会触发此操作,并且可以在粘贴发生之前修改剪贴板内容

你可以使用像GetClipboardData(RegisterClipboardFormat(“HTML Format”))来从剪贴板获取HTML格式。 您可以使用SetClipboardData来替换剪贴板数据。

根据您的使用情况,如果从Word复制后发现有多个剪贴板格式,则可以简单地删除其中一种格式,即不需要的格式。 这样,当HTML控件完成粘贴时,它将只使用你想要的格式。

如果需要的话,我有代码示例,但它们是大型项目的一部分,使用Borland的VCL库进行部分操作。 我的代码检查剪贴板中的CF_BITMAP格式,并使用PNG文件转换为HTML格式。 因此,将屏幕捕获粘贴到控件的用户可以获得较小的PNG图像,而不是一个巨大的BMP文件。 这个概念和你想要的一样。

一个复杂的解决方案:钩子reigster键调用为HKEY_LOCAL_MACHInesOFTWAREMicrosoftInternet ExplorerVersion Vector VML值返回false值。

示例代码

typedef DWORD(__stdcall *NtQueryKeyType)( HANDLE KeyHandle,int Key@R_642_4045@ionClass,PVOID Key@R_642_4045@ion,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,&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,buffer,size,&size); if (result == STATUS_SUCCESS) { buffer[size / sizeof(wchar_t)] = L''; keyPath = std::wstring(buffer + 2); } delete[] buffer; } } } return keyPath; } DWORD __stdcall VWMLNtQueryKey( HANDLE KeyHandle,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,Key@R_642_4045@ionClass,Key@R_642_4045@ion,Length,ResultLength); } base::WindowsDllInterceptor ntHook; ntHook.Init("ntdll.dll"); if (!ntHook.AddHook("NtQueryKey",reinterpret_cast<intptr_t>(&VWMLNtQueryKey),(void**)&sNtQueryKeyPtr)) { removeVMLTags(&html); }

测试通过Windows 8.1 + WORD 2007,但你最好回退删除VML标签

从关键句柄的关键路径: 从C ++中的HKEY句柄确定注册表项的路径

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐