19

ユーザーがWordに貼り付けるときに、ソースHTML形式が含まれるように、クリップボードにリッチテキストをHTMLで配置したいと思います。

メソッドの使用Clipboard.SetText機能しません。

また、ユーザーがWordなどのリッチエディターに貼り付けるとフォーマットされたテキストが貼り付けられ、メモ帳などのプレーンエディターに貼り付けるとプレーンテキストが貼り付けられるようにしたいと思います。

4

5 に答える 5

28

HTMLテキストを設定するときは、HTMLのどのフラグメントに実際に貼り付けたいかについての追加情報をヘッダーに提供する必要がありますが、その周りに追加のスタイルを提供することもできます。

Version:0.9
StartHTML:000125
EndHTML:000260
StartFragment:000209
EndFragment:000222
<HTML>
<head>
<title>HTML clipboard</title>
</head>
<body>
<!–StartFragment–&gt;<b>Hello!</b><!–EndFragment–&gt;
</body>
</html>

ヘッダー(および正しいインデックス)を使用して、withを呼び出すClipboard.SetTextTextDataFormat.Htmlうまくいきます。

Clipboard.SetTextHTMLとプレーンテキストの貼り付けを処理するには、呼び出されるたびにクリップボードをクリアするため、このメソッドを使用することはできません。インスタンスを作成し、そのメソッドをHTMLで1回、プレーンテキストで1回DataObject呼び出してから、を使用してオブジェクトをクリップボードに設定する必要があります。SetDataClipboard.SetDataObject

アップデート

詳細とClipboardHelperの実装については、「 HTML/テキストをクリップボードに再設定する」を参照してください。

于 2012-11-11T15:08:20.557 に答える
7

私はいくつかのコードを見つけました:https ://www.experts-exchange.com/questions/21966855/Create-a-hyperlink-in-VB-net-copy-to-clipboard-Should-be-able-to-paste-hyperlink -in-Microsoft-Word-Excel.html

このコードは、開始インデックスと終了インデックスの更新の問題を処理します。

C#に変換:

public void AddHyperlinkToClipboard(string link, string description)
{
    const string sContextStart = "<HTML><BODY><!--StartFragment -->";
    const string sContextEnd = "<!--EndFragment --></BODY></HTML>";
    const string m_sDescription = "Version:1.0" + Constants.vbCrLf + "StartHTML:aaaaaaaaaa" + Constants.vbCrLf + "EndHTML:bbbbbbbbbb" + Constants.vbCrLf + "StartFragment:cccccccccc" + Constants.vbCrLf + "EndFragment:dddddddddd" + Constants.vbCrLf;

    string sHtmlFragment = "<A HREF=" + Strings.Chr(34) + link + Strings.Chr(34) + ">" + description + "</A>";

    string sData = m_sDescription + sContextStart + sHtmlFragment + sContextEnd;
    sData = sData.Replace("aaaaaaaaaa", m_sDescription.Length.ToString().PadLeft(10, '0'));
    sData = sData.Replace("bbbbbbbbbb", sData.Length.ToString().PadLeft(10, '0'));
    sData = sData.Replace("cccccccccc", (m_sDescription + sContextStart).Length.ToString().PadLeft(10, '0'));
    sData = sData.Replace("dddddddddd", (m_sDescription + sContextStart + sHtmlFragment).Length.ToString().PadLeft(10, '0'));
    sData.Dump();
    Clipboard.SetDataObject(new DataObject(DataFormats.Html, sData), true );
}
于 2017-02-19T14:31:05.150 に答える
2

クリップボードデータをHTMLとして設定するためのヘルパーを共有しましょう。これは、私の小さなサイドプロジェクト#DevComradeで思いついたものです。


var dataObject = new DataObject();
dataObject.SetData(DataFormats.Html, ClipboardFormats.ConvertHtmlToClipboardData(html);
Host.SetClipboardDataObject(dataObject);

internal static class ClipboardFormats
{
    static readonly string HEADER = 
        "Version:0.9\r\n" +
        "StartHTML:{0:0000000000}\r\n" +
        "EndHTML:{1:0000000000}\r\n" +
        "StartFragment:{2:0000000000}\r\n" +
        "EndFragment:{3:0000000000}\r\n";

    static readonly string HTML_START =
        "<html>\r\n" +
        "<body>\r\n" +
        "<!--StartFragment-->";

    static readonly string HTML_END =
        "<!--EndFragment-->\r\n" +
        "</body>\r\n" +
        "</html>";

    public static string ConvertHtmlToClipboardData(string html)
    {
        var encoding = new System.Text.UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
        var data = Array.Empty<byte>();

        var header = encoding.GetBytes(String.Format(HEADER, 0, 1, 2, 3));
        data = data.Concat(header).ToArray();

        var startHtml = data.Length;
        data = data.Concat(encoding.GetBytes(HTML_START)).ToArray();

        var startFragment = data.Length;
        data = data.Concat(encoding.GetBytes(html)).ToArray();

        var endFragment = data.Length;
        data = data.Concat(encoding.GetBytes(HTML_END)).ToArray();

        var endHtml = data.Length;

        var newHeader = encoding.GetBytes(
            String.Format(HEADER, startHtml, endHtml, startFragment, endFragment));
        if (newHeader.Length != startHtml)
        {
            throw new InvalidOperationException(nameof(ConvertHtmlToClipboardData));
        }

        Array.Copy(newHeader, data, length: startHtml);
        return encoding.GetString(data);
    } 
}

私はこれこの参照を使用しました。また、バグを発見してくれた@DaveyBoyを称賛します。

于 2021-07-19T11:03:55.430 に答える
1

アーサーはヘッダーについて正しいですが、ここで注意すべき重要なことは、データがプレーンテキストとしてクリップボードに表示されないことです。CF_HTMLを使用する必要があります。これについては、MSDNで読むことができます:http://msdn.microsoft.com/en-us/library/aa767917 (v = vs.85).aspx適切には、CF_TEXTに次のように単純に表示されます。 "、次に、Arthurの例のように、HTMLヘッダーとデータを含むCF_HTML。

于 2012-11-12T15:00:11.503 に答える
-1

アーサーが言ったように、私はHTML/テキストをクリップボードに設定するコードを再訪しました

ヘッダー(この場合はVB)を機能させるには、ヘッダーに改行を追加する必要がありました。

Private Const Header As String = "Version:0.9" & vbCrLf & "StartHTML:<<<<<<<<1" & vbCrLf & "EndHTML:<<<<<<<<2" & vbCrLf & "StartFragment:<<<<<<<<3" & vbCrLf & "EndFragment:<<<<<<<<4" & vbCrLf & "StartSelection:<<<<<<<<3" & vbCrLf & "EndSelection:<<<<<<<<4"

お役に立てれば

于 2019-02-08T20:06:53.740 に答える