【问题标题】:How can I read raw (CF_HTML) clipboard data in a webpage or C#?如何在网页或 C# 中读取原始 (CF_HTML) 剪贴板数据?
【发布时间】:2008-09-26 20:04:22
【问题描述】:

如果我将所选网页从 Firefox 拖放到 HTML-Kit,HTML-Kit 会询问我是要粘贴为文本还是 HTML。如果我选择“文本”,我会得到:

Version:0.9
StartHTML:00000147
EndHTML:00000516
StartFragment:00000181
EndFragment:00000480
SourceURL:http://en.wikipedia.org/wiki/Herodotus
<html><body>
<!--StartFragment-->Additional details have been garnered from the <i><a href="http://en.wikipedia.org/wiki/Suda" title="Suda">Suda</a></i>, an 11th-century encyclopaedia of the <a href="http://en.wikipedia.org/wiki/Byzantium" title="Byzantium">Byzantium</a> which likely took its information from traditional accounts.<!--EndFragment-->
</body>
</html>

According to MSDN,这是“CF_HTML”格式的剪贴板数据。在 OS X 和 Linux 系统上是否相同?

有没有办法在网页到网页的拖放操作中访问这种详细信息(而不仅仅是纯剪辑片段)? C# WinForms 桌面应用程序呢?

【问题讨论】:

    标签: drag-and-drop clipboard copy-paste


    【解决方案1】:

    为了完整起见,这里是获取 RAW 剪贴板数据的 P/Invoke Win32 API 代码

    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; 
        }
    }
    

    【讨论】:

    【解决方案2】:

    这是 Microsoft 特定的,不要期望在其他操作系统中看到相同的信息。
    请注意,当您从 IE 复制片段时,您会得到相同的格式。

    我不确定您所说的“网页到网页拖放操作”是什么意思。往哪里掉?文本区域?

    我不懂 C#,但在 C/C++ 应用程序中,您必须使用 OpenClipboard 和相关的 Win32 API 来获取此信息。特别是,GetClipboardData(CF_HTML) 允许您获取此信息(也可以以纯文本形式获取,例如,或 Unicode 数据等)。

    【讨论】:

    • 网页到网页是指将文本从一页拖到另一页,拖到文本框或文本区域中。理想情况下,我想做的是访问 SourceURL 属性并找出数据的来源。
    【解决方案3】:

    WinForms 应用程序可以使用Clipboard.GetText 来获取它。但是,我认为没有办法在网页中执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      相关资源
      最近更新 更多