2011-07-21 19 views
6

Tôi đang sử dụng điều khiển MSHTML ở chế độ chỉnh sửa. Khi tôi sao chép và dán nội dung từ từ vào kiểm soát của mình, các điều khiển MSHTML sẽ loại bỏ HTML chuẩn và giữ đánh dấu VML không được hỗ trợ rất tốt ở đó.Cách tắt VML trong MSHTML

Nếu tôi hủy đăng ký Dll VML (regsvr32 -u "% ProgramFiles% \ Common Files \ Microsoft Shared \ VGX \ vgx.dll) thì điều khiển hoạt động theo cách tôi muốn và loại bỏ VML và giữ HTML.

Tôi chưa có cách nào có thể lập trình để nói với MSHTML rằng tôi không muốn VML nhưng HTML. Bất kỳ ý tưởng nào?

+0

Tôi đoán thay thế sẽ được chấp nhận rằng nó tạo ra VML, nhưng chạy nó thông qua một VML-> công cụ chuyển đổi SVG sau đó (ví dụ http://sourceforge.net/ dự án/vectorconverter /) – Spudley

Trả lời

1

Xin lỗi nếu câu trả lời này không hoàn hảo, nhưng với độ tuổi của câu hỏi và bao nhiêu người quan tâm, tôi nghĩ tôi sẽ chụp một bức ảnh và hy vọng sẽ giúp ai đó nếu không phải là OP.

Tôi không chắc chắn cách VML/Word xử lý dữ liệu clipboard. khai thác nhiều định dạng trong Windows Clipboard, một với HTML bạn muốn, và một với định dạng VML, sau đó bạn đang ở may mắn và điều này sẽ làm việc. Nếu không, thì có lẽ bạn có thể sử dụng điều này để làm sạch mã trên chèn ít nhất.

Bạn sẽ muốn xem xét IDocHostUIHandler::TranslateAccelerator. Bạn cần triển khai IDocHostUIHandler nếu bạn chưa thực hiện. Bạn sử dụng ICustomDoc::SetUIHandler để đăng ký, sau khi tài liệu HTML được tải (có thể là trang trống nếu bạn sử dụng).

Bên trong TranslateAccelerator bạn cần xem cho nCmdID == IDM_PASTE. Điều này được kích hoạt trước khi người dùng dán nội dung nào đó vào điều khiển HTML và bạn có thể sửa đổi nội dung của khay nhớ tạm trước khi quá trình dán xảy ra.

Bạn có thể sử dụng một cái gì đó như GetClipboardData (RegisterClipboardFormat ("Định dạng HTML")), để lấy định dạng HTML từ khay nhớ tạm. Bạn có thể sử dụng SetClipboardData để thay thế dữ liệu clipboard.

Để sử dụng, nếu bạn thấy có nhiều định dạng clipboard sau khi sao chép từ Word, bạn chỉ cần xóa một trong các định dạng mà bạn không muốn. Bằng cách đó, khi điều khiển HTML hoàn thành việc dán, nó sẽ chỉ sử dụng định dạng bạn muốn.

Tôi có các ví dụ mã nếu cần, nhưng chúng là một phần của một dự án lớn và sử dụng thư viện VCL của Borland cho một số phần. Mã của tôi kiểm tra định dạng CF_BITMAP trong khay nhớ tạm và chuyển thành Định dạng HTML bằng cách sử dụng tệp PNG thay thế. Vì vậy, người dùng dán ảnh chụp màn hình vào điều khiển sẽ có được hình ảnh PNG nhỏ hơn thay vì tệp BMP lớn. Khái niệm này giống như những gì bạn muốn.

0

Một giải pháp phức tạp: Hook reigster giá trị false trả về giá trị trả về cho HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version VectorVML giá trị.

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

thử nghiệm vượt qua Windows 8.1 + WORD 2007 nhưng bạn muốn dự phòng tốt hơn để loại bỏ VML Tags.

con đường chính từ tay cầm chìa khóa từ: Determine path to registry key from HKEY handle in C++