public static Range GetRange ()
{
IDataObject dataObject = System.Windows.Forms.Clipboard . GetDataObject () as IDataObject ;
IStream iStream = IStreamFromDataObject (dataObject);
IMoniker compositeMoniker = IMonikerFromIStream (iStream);
return RangeFromCompositeMoniker (compositeMoniker);
}
private const string CF_LINKSOURCE_ID = "Link Source" ;
private static IStream IStreamFromDataObject ( IDataObject dataObject)
{
STGMEDIUM medium;
FORMATETC formatEtc = new FORMATETC ();
formatEtc. cfFormat = ( short ) System.Windows.Forms.DataFormats . GetFormat ( CF_LINKSOURCE_ID ). Id ;
formatEtc. dwAspect = DVASPECT . DVASPECT_CONTENT ;
formatEtc. lindex = - 1 ;
formatEtc. ptd = new IntPtr ( 0 );
formatEtc. tymed = TYMED . TYMED_ISTREAM ;
dataObject. GetData ( ref formatEtc, out medium);
return Marshal . GetObjectForIUnknown (medium. unionmember ) as IStream ;
}
private static IMoniker IMonikerFromIStream ( IStream iStream)
{
iStream. Seek ( 0 , 0 , IntPtr . Zero );
Guid guid = Marshal . GenerateGuidForType ( typeof ( stdole . IUnknown ));
object obj;
if ( ole32 . OleLoadFromStream (iStream, ref guid, out obj))
return obj as IMoniker ;
else
return null ;
}
private static Range RangeFromCompositeMoniker ( IMoniker compositeMoniker)
{
List < IMoniker > monikers = SplitCompositeMoniker (compositeMoniker);
if (monikers. Count != 2 )
throw new ApplicationException ( "Invalid moniker" );
IBindCtx bindctx;
if (! ole32 . CreateBindCtx ( 0 , out bindctx) || bindctx == null )
throw new ApplicationException ( "Can't create bindctx" );
object obj;
Guid workbookGuid = Marshal . GenerateGuidForType ( typeof ( Workbook ));
monikers[ 0 ]. BindToObject (bindctx, null , ref workbookGuid, out obj);
Workbook workbook = obj as Workbook ;
ExcelItemMonikerHelper helper = new ExcelItemMonikerHelper (monikers[ 1 ], bindctx);
return helper. GetRange (workbook);
}
private static List < IMoniker > SplitCompositeMoniker ( IMoniker compositeMoniker)
{
List < IMoniker > monikerList = new List < IMoniker >();
IEnumMoniker enumMoniker;
compositeMoniker. Enum ( true , out enumMoniker);
if (enumMoniker != null )
{
IMoniker [] monikerArray = new IMoniker [ 1 ];
IntPtr fetched = new IntPtr ();
HRESULT res;
while (res = enumMoniker. Next ( 1 , monikerArray, fetched))
{
monikerList. Add (monikerArray[ 0 ]);
}
return monikerList;
}
else
throw new ApplicationException ( "IMoniker is not composite" );
}
Source: https://habr.com/ru/post/124964/