C# 如何在Win32 API中从IDataObject提取数据 上下文 长话短说

C# 如何在Win32 API中从IDataObject提取数据 上下文 长话短说,c#,winapi,C#,Winapi,你好! 我正在开发一个SolidEdgde插件,其中包括对删除的元数据文件作出反应,在删除元数据文件后,下载所有需要的文件,以在所述CAD中打开它们 SolidEdge API不公开拖放事件,这将为该问题提供一个简单的解决方案。但是,它确实提供了一个常规事件,该事件仅通知将执行具有给定ID的操作: 命令运行前的公共无效(在命令ID中) 您可以清楚地看到,我没有DragEventArgs。这就是我决定尝试使用Win32 API寻找解决方案的原因 TL;博士 我可以访问一种方法,该方法会通知我预丢

你好!

我正在开发一个SolidEdgde插件,其中包括对删除的元数据文件作出反应,在删除元数据文件后,下载所有需要的文件,以在所述CAD中打开它们

SolidEdge API不公开拖放事件,这将为该问题提供一个简单的解决方案。但是,它确实提供了一个常规事件,该事件仅通知将执行具有给定ID的操作:

命令运行前的公共无效(在命令ID中)
您可以清楚地看到,我没有
DragEventArgs
。这就是我决定尝试使用Win32 API寻找解决方案的原因

TL;博士 我可以访问一种方法,该方法会通知我预丢弃;但是,它不提供
DragEventArgs

我试过的 System.Windows.Forms.Clipboard 以下类不提供拖动的对象

Win32
[DllImport(“ole32”)]
专用静态外部int OLEGETCLIPTOR(输出IDataObject数据);
命令运行前的公共无效(在命令ID中)
{
IEnumerable GetFormats(IEnumFORMATETC可枚举)
{
while(true)
{
var格式=新格式等[1];
变量计数=新整数[1];
var x=可枚举。下一步(1,格式,计数);
如果(x==0)
收益率返回格式[0];
打破
}
}
开关(命令ID)
{
案例42:
var结果=OleGetClipboard(输出IDataObject数据);
var enumerable=data.EnumFormatEtc(DATADIR.DATADIR\u GET);
var formats=GetFormats(可枚举).ToList();
data.GetData(formats.First(),out STGMEDIUM extract);
var draggedObject=黑魔法(摘录);
打破
}
}
私有的黑魔法(沙丁胺醇提取物)
{
//待办事项
}
使用这些方法,我能够检索一种无法使用的介质。如果我使用
System.Windows.IDataObject
而不是这个Win32 API
IDataObject
一切都会很好

已检查System.Windows.IDataObject 我认为这个类将包装Win32 API,并可能具有某种转换逻辑。不幸的是,我找不到类似的东西。该类确实调用Win32 API方法

我的呼救声
  • 这样做对吗
  • 如果是,我如何进行
  • 如果能够将Win32 DataObject转换为System window one,那就太完美了

    提前感谢您的帮助

    更新 更新1(17.02.2020) 来自的问题:


    SolidEdgeFramework.ISEApplicationWindowEvents怎么样?这不是你观察窗口信息的入口吗

    不,不是。这将公开具有更多事件参数的WindowsProc事件;然而,它们都不是我需要的

    来自的问题:

    在Win32 IDataObject接口中,要使用的方法无效

    谢谢,IntPtr文档将我推向了正确的方向。我需要的方法是IDataObject.GetDataPresent(类型)和IDataObject.GetData(类型)


    我将尝试使用一些Marshall方法提取我的数据。

    SolidEdgeFramework.ISEApplicationWindowEvents怎么样?这不是您观察任何窗口消息的条目吗?如果您的意思是不知道如何处理
    IntPtr
    STGMEDIUM.unionmember
    ),您可以参考。为什么要“将Win32数据对象转换为系统窗口对象”?您想在Win32中使用的方法无效?“这将公开具有更多事件参数的WindowsProc事件;但是,它们都不是我需要的。”-您确定吗?听起来你想处理。