Here's how to read raw HTML from Clipboard using P/Invoke Win32 Native methods specify clipboard data type CF_HTML
Avoid Clipboard.GetText(TextDataFormat.Html) and use the below P/Invoke, especially with .NET 4.0 Framework or less, because funny characters are introduced.
See my blogpost How to get HTML from the Windows system clipboard directly using PInvoke Win32 Native methods avoiding bad funny characters
using System; using System.Runtime.InteropServices; using System.Text; //-------------------------------------------------------------------------------- http://metadataconsulting.blogspot.com/2019/06/How-to-get-HTML-from-the-Windows-system-clipboard-directly-using-PInvoke-Win32-Native-methods-avoiding-bad-funny-characters.html //-------------------------------------------------------------------------------- public class ClipboardHelper { #region Win32 Native PInvoke [DllImport("User32.dll", SetLastError = true)] private static extern uint RegisterClipboardFormat(string lpszFormat); //or specifically - private static extern uint RegisterClipboardFormatA(string lpszFormat); [DllImport("User32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool IsClipboardFormatAvailable(uint format); [DllImport("User32.dll", SetLastError = true)] private static extern IntPtr GetClipboardData(uint uFormat); [DllImport("User32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool OpenClipboard(IntPtr hWndNewOwner); [DllImport("User32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool CloseClipboard(); [DllImport("Kernel32.dll", SetLastError = true)] private static extern IntPtr GlobalLock(IntPtr hMem); [DllImport("Kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool GlobalUnlock(IntPtr hMem); [DllImport("Kernel32.dll", SetLastError = true)] private static extern int GlobalSize(IntPtr hMem); #endregion public static string GetHTMLWin32Native() { string strHTMLUTF8 = string.Empty; uint CF_HTML = RegisterClipboardFormatA("HTML Format"); if (CF_HTML != null || CF_HTML == 0) return null; if (!IsClipboardFormatAvailable(CF_HTML)) return null; try { if (!OpenClipboard(IntPtr.Zero)) return null; IntPtr handle = GetClipboardData(CF_HTML); if (handle == IntPtr.Zero) return null; IntPtr pointer = IntPtr.Zero; try { pointer = GlobalLock(handle); if (pointer == IntPtr.Zero) return null; uint size = GlobalSize(handle); byte[] buff = new byte[size]; Marshal.Copy(pointer, buff, 0, (int)size); strHTMLUTF8 = System.Text.Encoding.UTF8.GetString(buff); } finally { if (pointer != IntPtr.Zero) GlobalUnlock(handle); } } finally { CloseClipboard(); } return strHTMLUTF8; } }
No comments:
Post a Comment