次の方法で共有


Visual C++ を使用して HTML コードをクリップボードに追加する

この記事では、Visual C++ を使用して Hypertext Markup Language (HTML) コードを Microsoft Windows クリップボードに追加する方法について説明します。

元の製品バージョン: Visual C++
元の KB 番号: 274308

概要

この記事には、HTML コードをクリップボードに追加するプロセスを簡略化するためにアプリケーションで使用できるサンプル関数が含まれています。

HTML クリップボード形式

HTML には HTML 形式 (CF_HTML) という独自のクリップボード形式があり、Excel、Word、その他の Office アプリケーションなどの他のアプリケーションにデータを提供するために使用できます。

CF_HTMLは、完全にテキスト ベースの形式であり、そのコンテキスト内に説明、コンテキスト、フラグメントが含まれます。 クリップボードに送信するデータを作成するときは、クリップボードのバージョンとコンテキストとフラグメントのオフセットを示すデータの説明を含める必要があります。 オフセットの計算が困難な場合があります。 ただし、このタスクを簡略化するには、次のルーチンを使用できます。

詳細については、「 HTML クリップボード形式」を参照してください。

サンプル コード

// CopyHtml() - Copies given HTML to the clipboard.
// The HTML/BODY blanket is provided, so you only need to
// call it like CallHtml("<b>This is a test</b>");

void CopyHTML(char *html)
{
    // Create temporary buffer for HTML header...
    char *buf = new char [400 + strlen(html)];
    if(!buf) return;

    // Get clipboard id for HTML format...
    static int cfid = 0;
    if(!cfid) cfid = RegisterClipboardFormat("HTML Format");

    // Create a template string for the HTML header...
    strcpy(buf,
        "Version:0.9\r\n"
        "StartHTML:00000000\r\n"
        "EndHTML:00000000\r\n"
        "StartFragment:00000000\r\n"
        "EndFragment:00000000\r\n"
        "<html><body>\r\n"
        "<!--StartFragment -->\r\n");

    // Append the HTML...
    strcat(buf, html);
    strcat(buf, "\r\n");
    // Finish up the HTML format...
    strcat(buf,
        "<!--EndFragment-->\r\n"
        "</body>\r\n"
        "</html>");

    // Now go back, calculate all the lengths, and write out the
    // necessary header information. Note, wsprintf() truncates the
    // string when you overwrite it so you follow up with code to replace
    // the 0 appended at the end with a '\r'...
    char *ptr = strstr(buf, "StartHTML");
    wsprintf(ptr+10, "%08u", strstr(buf, "<html>") - buf);
    *(ptr+10+8) = '\r';

    ptr = strstr(buf, "EndHTML");
    wsprintf(ptr+8, "%08u", strlen(buf));
    *(ptr+8+8) = '\r';

    ptr = strstr(buf, "StartFragment");
    wsprintf(ptr+14, "%08u", strstr(buf, "<!--StartFrag") - buf);
    *(ptr+14+8) = '\r';

    ptr = strstr(buf, "EndFragment");
    wsprintf(ptr+12, "%08u", strstr(buf, "<!--EndFrag") - buf);
    *(ptr+12+8) = '\r';

    // Now you have everything in place ready to put on the clipboard.
    // Open the clipboard...
    if(OpenClipboard(0))
    {
        // Empty what's in there...
        EmptyClipboard();

        // Allocate global memory for transfer...
        HGLOBAL hText = GlobalAlloc(GMEM_MOVEABLE |GMEM_DDESHARE, strlen(buf)+4);

        // Put your string in the global memory...
        char *ptr = (char *)GlobalLock(hText);
        strcpy(ptr, buf);
        GlobalUnlock(hText);

        ::SetClipboardData(cfid, hText);

        CloseClipboard();
        // Free memory...
        GlobalFree(hText);
    }
    // Clean up...
    delete [] buf;
}

この関数を使用して HTML コード フラグメントをクリップボードにコピーすると、次の例のようになります。

char *html =
    "<b>This is a test</b><hr>"
    "<li>entry 1"
    "<li>entry 2";
CopyHTML(html);

詳細

HTML コードをクリップボードに送信するアプローチを使用することは、Office オートメーション クライアントにとって特に有益な場合があります。 たとえば、Excel のセルまたはWordの段落の書式設定されたデータを生成する必要があるオートメーション クライアントがある場合は、HTML コードでデータをビルドし、クリップボードに送信して、アプリケーションに貼り付けることができます。 この手法を使用すると、Automation クライアントへのプロセス外呼び出しの数を減らすことができます。