首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何读取网页或C#中的原始(CF_HTML)剪贴板数据?

如何读取网页或C#中的原始(CF_HTML)剪贴板数据?
EN

Stack Overflow用户
提问于 2008-09-26 20:04:22
回答 3查看 2.9K关注 0票数 2

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

代码语言:javascript
复制
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桌面应用程序怎么样?

EN

回答 3

Stack Overflow用户

发布于 2019-08-28 00:02:18

为了完整起见,下面是用于获取原始剪贴板数据的P/Invoke Win32应用编程接口代码

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2008-09-26 20:22:37

这是微软特有的,不要期望在其他OSes中看到相同的信息。

请注意,当您从IE复制片段时,您会得到相同的格式。

我不明白你所说的“网页到网页的拖放操作”是什么意思。放在哪里?一个文本区?

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

票数 1
EN

Stack Overflow用户

发布于 2008-09-26 20:43:34

WinForms应用程序可以使用Clipboard.GetText来获取它。然而,我不认为有办法在网页中做到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/141630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档