unsafe void Win32Com.IDropTarget.Drop(Win32Com.IDataObject pDataObj, int grfKeyState, UnmanagedMethods.POINT pt, DropEffect *pdwEffect) { try { var dispatch = _tl?.Input; if (dispatch == null) { *pdwEffect = (int)DropEffect.None; } SetDataObject(pDataObj); var args = new RawDragEvent( _dragDevice, RawDragEventType.Drop, _target, GetDragLocation(pt), _currentDrag, ConvertDropEffect(*pdwEffect), ConvertKeyState(grfKeyState) ); dispatch(args); *pdwEffect = ConvertDropEffect(args.Effects); } finally { ReleaseDataObject(); } }
private void SetDataObject(Win32Com.IDataObject pDataObj) { var newDrag = GetAvaloniaObjectFromCOM(pDataObj); if (_currentDrag != newDrag) { ReleaseDataObject(); _currentDrag = newDrag; } }
public static unsafe IDataObject GetAvaloniaObjectFromCOM(Win32Com.IDataObject pDataObj) { if (pDataObj is null) { throw new ArgumentNullException(nameof(pDataObj)); } if (pDataObj is IDataObject disposableDataObject) { return(disposableDataObject); } var dataObject = MicroComRuntime.TryUnwrapManagedObject(pDataObj) as DataObject; if (dataObject is not null) { return(dataObject); } return(new OleDataObject(pDataObj)); }