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