where XXXXXXXX is the offset of the beginning of the html content (in fact, the length of the header),Version: 1.0 StartHTML: XXXXXXXX EndHTML: YYYYYYYY StartFragment: ZZZZZZZZ EndFragment: TTTTTTTT <html .... <a href="http://some.site.com/target"> Some target </a> ... </ html>
void CopyLink (Uri target, string title)
{
var htmlContent = MakeLink (target, title);
var data = new DataObject ();
data.SetData (DataFormats.Text, true, target.ToString ());
data.SetData (DataFormats.Unicode, true, html_content);
data.SetData (DataFormats.Html, true, formatted_buffer);
Clipboard.SetDataObject (data, true);
} [DllImport ("user32.dll")]
private static extern IntPtr SetClipboardData (uint uFormat, IntPtr hMem);
[DllImport ("user32.dll")]
private static extern bool OpenClipboard (IntPtr hWndNewOwner);
[DllImport ("user32.dll")]
private static extern bool EmptyClipboard ();
[DllImport ("user32.dll")]
private static extern bool CloseClipboard ();
[DllImport ("user32.dll", SetLastError = true)]
private static extern uint RegisterClipboardFormat (string lpszFormat);
void CopyLink (Uri target, string title)
{
var htmlContent = MakeLink (target, title, Encoding.UTF8);
if (! OpenClipboard (IntPtr.Zero))
throw new Exception ("Failed to open clipboard");
EmptyClipboard ();
var pText = IntPtr.Zero;
var pHtml = IntPtr.Zero;
try
{
pText = Marshal.StringToHGlobalAnsi (target.ToString ());
SetClipboardData (1 / * CF_TEXT * /, pText); // For TEXT and UNICODETEXT
var bytes = Encoding.UTF8.GetBytes (htmlContent);
pHtml = Marshal.AllocHGlobal (bytes.Length);
Marshal.Copy (bytes, 0, pHtml, bytes.Length);
SetClipboardData (RegisterClipboardFormat (DataFormats.Html), pHtml);
}
finally
{
CloseClipboard ();
if (pText! = IntPtr.Zero)
Marshal.FreeHGlobal (pText);
if (pHtml! = IntPtr.Zero)
Marshal.FreeHGlobal (pHtml);
}
} string MakeLink (Uri target, string title, Encoding encoding)
{
const int numberLengthWithCr = 11;
var htmlIntro = "<html> \ n <head> \ n <meta http-equiv = \" Content-Type \ "content = \" text / html; charset = "
+ encoding.WebName + "\" /> \ n </ head> \ n <body> \ n <! - StartFragment -> ";
var htmlOutro = "<! - EndFragment -> \ n </ body> \ n </ html>";
var htmlLink = string.Format ("<a href=\"{0}\" {1} </a>", target, title);
var startHtmlIndex = 57 + 4 * numberLengthWithCr;
var startFragmentIndex = startHtmlIndex + encoding.GetByteCount (htmlIntro);
var endFragmentIndex = startFragmentIndex + encoding.GetByteCount (htmlLink);
var endHtmlIndex = endFragmentIndex + encoding. GetByteCount (htmlOutro);
var buff = new StringBuilder ();
buff.AppendFormat ("Version: 1.0 \ n");
buff.AppendFormat ("StartHTML: {0: 0000000000} \ n", startHtmlIndex);
buff.AppendFormat ("EndHTML: {0: 0000000000} \ n", endHtmlIndex);
buff.AppendFormat ("StartFragment: {0: 0000000000} \ n", startFragmentIndex);
buff.AppendFormat ("EndFragment: {0: 0000000000} \ n", endFragmentIndex);
buff.Append (htmlIntro) .Append (htmlLink) .Append (htmlOutro);
return buff.ToString ();
} the spacing between the lines is just deadly. </ habracut>
Source: https://habr.com/ru/post/24712/
All Articles