用Clipboard获取HTML格式内容

.NET的Clipboard.GetData(DataFormats.Html)方法有BUG。
网上查询了一下,有个解决方法,不过那个网站被封了(至少我这没法访问)
用某软件上去看了一下,照做,OK了

using  System;
using  System.Text;
using  System.Diagnostics;
using  System.Windows.Forms;
using  System.Runtime.InteropServices;
using  System.Runtime.InteropServices.ComTypes;



namespace  JX
{
    
/**//// <summary>
    
/// By JX
    
/// Version 1.0.200511041900   
    
/// This static class contains a method to extract Dataformat.Html data from a IDataObject 
    
/// obtained from the Clipboard or a Drag and Drop operation.
    
/// The method overcomes the UTF8 corruption problem encountered in .NET Framework version 2.0.50727.42
    
/// Version 1.0 of the Dataformat.Html data has a header like this:
    
/// 
    
/// Version:1.0
    
/// StartHTML:000000238
    
/// EndHTML:000000546
    
/// StartFragment:000000353
    
/// EndFragment:000000510
    
/// StartSelection:000000353
    
/// EndSelection:000000510
    
/// 
    
/// The values refer to the BYTES of the string not the actual chars
    
/// </summary>

    static class HtmlFromIDataObject
    
{
        
/**//// <summary>
        
/// Extracts data of type Dataformat.Html from an IdataObject data container
        
/// This method shouldn't throw any exception but writes relevant exception informations in the debug window
        
/// </summary>
        
/// <param name="data">IdataObject data container</param>
        
/// <returns>A byte[] array with the decoded string or null if the method fails</returns>

        public static byte[] GetHtml(System.Windows.Forms.IDataObject data)
        
{
            System.Runtime.InteropServices.ComTypes.IDataObject interopData 
= data as System.Runtime.InteropServices.ComTypes.IDataObject;

            FORMATETC format 
= new FORMATETC();          
            format.cfFormat 
= (short)DataFormats.GetFormat(DataFormats.Html).Id;
            format.dwAspect 
= DVASPECT.DVASPECT_CONTENT;
            format.lindex 
= -1;   
            format.tymed 
= TYMED.TYMED_HGLOBAL;

            STGMEDIUM stgmedium 
= new STGMEDIUM();
            stgmedium.tymed 
= TYMED.TYMED_HGLOBAL;
            stgmedium.pUnkForRelease 
= null;

            
int queryResult = 0;

            
try
            
{
                queryResult 
= interopData.QueryGetData(ref format);
            }

            
catch (Exception exp)
            
{
                Debug.WriteLine(
"HtmlFromIDataObject.GetHtml -> QueryGetData(ref format) threw an exception: " 
                    
+ Environment.NewLine + exp.ToString());
                
return null;
            }


            
if (queryResult != 0)
            
{
                Debug.WriteLine(
"HtmlFromIDataObject.GetHtml -> QueryGetData(ref format) returned a code != 0 code: " 
                    
+ queryResult.ToString());
                
return null;
            }


            
try
            
{
                interopData.GetData(
ref format, out stgmedium);
            }

            
catch (Exception exp)
            
{
                System.Diagnostics.Debug.WriteLine(
"HtmlFromIDataObject.GetHtml -> GetData(ref format, out stgmedium) threw this exception: " 
                    
+ Environment.NewLine + exp.ToString());
                
return null;
            }


            
if (stgmedium.unionmember == IntPtr.Zero)
            
{
                Debug.WriteLine(
"HtmlFromIDataObject.GetHtml -> stgmedium.unionmember returned an IntPtr pointing to zero");
                
return null;
            }


            IntPtr pointer 
= stgmedium.unionmember;
            
            HandleRef handleRef 
= new HandleRef(null, pointer);

            
byte[] rawArray = null;

            
try
            
{
                IntPtr ptr1 
= GlobalLock(handleRef);

                
int length = GlobalSize(handleRef);

                rawArray 
= new byte[length];

                Marshal.Copy(ptr1, rawArray, 
0, length);          

            }

            
catch (Exception exp)
            
{
                Debug.WriteLine(
"HtmlFromIDataObject.GetHtml -> Html Import threw an exception: " + Environment.NewLine + exp.ToString());
            }

            
finally
            
{
                GlobalUnlock(handleRef);

            }


            
return rawArray;
        }



        [DllImport(
"kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = true)]
        
private static extern IntPtr GlobalLock(HandleRef handle);

        [DllImport(
"kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = true)]
        
private static extern bool GlobalUnlock(HandleRef handle);

        [DllImport(
"kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = true)]
        
private static extern int GlobalSize(HandleRef handle);
 
    }

}



byte [] rawHtmlBytes  =  JX.HtmlFromIDataObject.GetHtml(dataObject)

string  rawHtml  =  Encoding.UTF8.GetString(rawHtmlBytes);

原文地址:http://bakamachine.blogspot.com/2006/05/workarond-for-dataobject-html.html

转载于:https://www.cnblogs.com/yushiro/archive/2007/09/15/894080.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值