问题标签 [idataobject]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1237 浏览

delphi - 在 Delphi 中从 IDataObject 中检索文件名

我正在构建一个 Delphi XE3 应用程序,它需要能够将文件拖放到它上面。我有资源管理器>应用程序方面的工作,但对于我的生活,我无法弄清楚从应用程序>应用程序时获取文件名。

假设从 Outlook(或任何其他应用程序)中删除了一个文件,只要我filename事先手动分配,我就有这个文件。

0 投票
1 回答
1087 浏览

c# - 保存复制到剪贴板的任何文件类型

我正在使用这篇Stack 文章(特别是第二个答案)中的代码来监视剪贴板何时更改。此应用程序的最终目标是用户可以复制任何文件类型(无论是 .xlsx、.pk3、.sln 等)、文件夹、图像或字符串,并将其自动保存到他们的临时目录。我会设置文件大小限制,以便临时文件夹不会超载。该应用程序的总体概念是提供便利,因此用户可以恢复被复制但随后被删除或丢失的数据。

到目前为止,上面引用的代码非常适用于字符串和图像。但是,在查看了 DataFormats 列表中的项目(即用法:DataFormats.Bitmap)后,我找不到任何文件类型或文件夹的全部内容。我也找不到任何方法来确定复制的文件类型。有什么方法可以确定吗?例如,如果有一种方法可以复制文件的文件扩展名,那将有所帮助。

可能是我的期望太高了。即使我保留了一组允许的文件类型(.xlsx、.sln 等),我也无法想到保存该类型的文件。似乎我无法从 DataObject 类型中获取字节,这将是一种简单的方法。

关于我如何做到这一点的任何想法?谢谢。

0 投票
0 回答
231 浏览

c++ - C++ 无法使 Async DragDrop 正常运行

我们目前的系统有一个 Silverlight UI(我们现阶段无法更改),它的拖放功能非常有限。我们目前的浏览器信任度提高了。因此,为了处理 Silverlight 的缺点,我创建了一个 c++ com 库来处理拖放事件。这对于来自其他应用程序的传入事件非常有效,但是我正在努力以我们的应用程序为源来获得拖动操作,使其正常工作。要从应用程序中拖动的大多数文件都是虚拟的,我已经设法开始工作,但是无论我尝试过什么,我都无法使操作异步,并且应用程序在此过程中锁定。

我最初只实现了 IAsyncOperation(需要向后兼容 xp),它没有明显的影响。我的 DataObject 被查询接口,获取 ref。调用 GetAsyncMode,返回 VARIANT_TRUE,然后调用 StartOperation。但是,所有操作都在同一个线程(ui 线程)上完成,并且似乎没有异步受到影响。

我随后尝试实现 ICallFactory 以返回 AsyncIDataObject。这里 explorer 似乎检查了 ICallFactory 接口,在调用对象上调用 CreateCall 并查询它以确保它具有正确的接口。使用符号服务器,我可以看到它发生在 AsyncStubInvoke 调用堆栈中。从这里调用 StdStubBuffer_QueryInterface 正在搜索 ICallFactory 接口。这个检查失败了,很遗憾我看不到这个接口正在检查什么对象。在此失败后,调用似乎在操作不支持错误(继接口不支持错误之后)后回退到 SyncStubInvoke。所有这些似乎也对最终结果没有影响,并且调用显然仍然与源应用程序锁定同步。

公开 com 调用的 DragDrop 类是 CComMultiThreadModel。我尝试使用我的 DataObject 作为不从 CComObjectRootEx 继承的基本类和在 IDL 中定义的包装器 IDataObject 类,并且确实从 CComObjectRootEx 继承,CComMultiThreadModel 也是如此。我也尝试过让这个类从 IDispatch 和 IUnknown 继承。

任何反馈将不胜感激。

0 投票
3 回答
172 浏览

c# - 在 C# 中获取 var 类型值

我的程序中有上面的代码。toCheck 是一个 IDataObjecct 包含一个文件(具体的图像)路径。

当我调试时,我看到存储在下面的值:
temp -> {string[1]}
[0] -> "C:\....rest of path"

一切都是正确的,但是当我尝试访问里面的字符串时,我不能。如果我使用 toString() 方法,它返回 System.String[] 但不返回文件路径。
关于如何检索变量内的文件路径的任何建议?

0 投票
0 回答
104 浏览

javascript - 从 HTML 页面拖放到 C++ 应用程序

我正在尝试实现从网页到 C++ 应用程序的拖放功能。

我正在设置拖动文本到 dataTransfer 对象,现在尝试从 IDataObject 在 DropTarget 上访问它。要从 IDataObject 获取数据,我们需要指定 FORMATETC,我想我遇到了问题。

这是代码: 在 HTML 端,我在 Drag 上执行了下面的 javascript。

在 C++ 方面:我有 DropTarget,实现 IDropTarget 并在 ::Drop 方法中接收 IDataObject。

为了从中获取数据,我使用以下代码:

但我无法在这里检索数据。有人可以帮我吗?

谢谢,凯拉斯

0 投票
1 回答
223 浏览

c# - WCF 在服务参考中定义了它自己的 DataObject 版本

我创建了一个我想在 WCF 调用中传递的对象……但在 ServiceReference1 中……这个对象被重新定义……有没有办法在任何地方都使用原始对象……似乎人们已经这样做了,但我不能弄清楚我做错了什么。

该对象用作服务合同中函数的参数。

当我尝试从客户端调用函数时出现的错误是“参数 1:无法从 'MyNameSpaceDTO.MyObject' 转换为 'MyNameSpace.ServiceReference1.MyObject'”</p>

该对象位于它自己的类库 dll 中,并标有 [DataObject] 和 [DataMember] 属性。

但是,在将服务参考添加为之后,也会在 Reference.cs 中结束:

此外,我在“添加服务参考”的“高级”部分中确实设置了以下内容:

[x] 在引用的程序集中重用类型

(o) 在所有引用的程序集中重用类型

0 投票
0 回答
272 浏览

winapi - 如何从放置目标确定拖放操作的源进程/hWnd

我的 C# Windows 应用程序接受拖动操作,我希望能够识别源的 hWnd 和/或进程 ID。这可能吗,我将如何确定它?

我已经尝试在拖动开始时获取活动窗口,但如果用户在拖动操作期间激活了其他窗口(例如,按Alt+Tab一次或多次),那不是很可靠。

我还尝试检查 IDataObject 上的格式,但该签名不足以可靠地识别源窗口。

0 投票
1 回答
451 浏览

c# - 如何复制剪贴板的整个(所有格式)

我们需要复制并重新发布剪贴板中的内容——所有格式。有没有办法做到这一点?

这是用例。我们有一些小的 docx/pptx/xlsx 文档,在我们的 Office 插件中,我们希望用户能够拖放到 word/ppt/xl 中。不幸的是,最好的文档格式是 html,它与实际的 docx/pptx/xlsx 不太接近。

所以,我的想法是我们(以 Word 为例)创建一个 Word Document 对象的实例(我们的代码是一个 Word AddIn,所以根据定义 Word 正在运行)。然后我们调用该 Document 对象以选择所有对象,然后粘贴选择。

此时剪贴板包含该粘贴的文档。包括 Word 用于在 Word 文档中复制/粘贴的未记录格式。这就是我们想要使用的格式。

如果我们可以将所有剪贴板内容复制到我们实现 IDataObject 的对象中并将该对象传递给 Control.DoDragDrop(),那么当用户将其放在 Word 中的某个位置时,他们会将其以未记录的格式提供给 Word具有所有 docx 格式。

有没有办法做到这一点?

更新:我们需要拖放文件内容(不仅仅是文本、完全格式化的文本、表格、形状、图表等)。

更新 2:我们需要将此作为 IDataObject 传递给 DoDragDrop(),而不是从剪贴板进行粘贴。当它发生时我们不需要得到通知,因为我们已经将 IDataObject 传递给 Windows 并且 Windows 从那里获取它。

0 投票
1 回答
1613 浏览

c# - 如何在不知道类型的情况下使用 IDataObject 的 GetData 函数?

我开发了一个功能,用户可以在我的应用程序上拖放电子邮件附件。我正在提取传递“FileGroupDescriptor”格式的拖放附件名称,并使用“FileContents”格式提取附件流。它在我的系统上运行良好,但在某些其他人系统此功能无法提取附件数据。所以,我正在考虑实现一个功能,我不硬编码类型格式并从 IDataObject 本身检索它。有什么办法吗?请在下面找到我正在使用的代码:

我使用以下代码调用上述函数:

0 投票
1 回答
349 浏览

c# - 将多个对象的组合复制到剪贴板(c#winforms)

C# Winforms 应用程序,Windows 10。

表单有一个richtextbox 和一个图表(都是MS)。目前具有将richtextbox复制到剪贴板的功能:

以及将图表作为图像复制到剪贴板的功能:

需要一个函数将两者作为一个单元进行复制(富文本在上面,图像在下面),以便 ctrl-v 将它们都粘贴到例如 Word 文档中。

尝试过 IDataObject,无法在对象中存储富文本而不会丢失颜色、字体大小、特殊字符。看起来 IDataObject 仍然只能一次粘贴一个东西,只是感知目标应用程序最可能想要的东西。

尝试使用 DrawString 组合 bmp,在富文本中保留多种颜色以及组装或连接位图时遇到了麻烦。

尝试了 CopyFromScreen,使用多个监视器定位问题并确定实际位置(this.Location.X 相对于容器,而不是屏幕),并且不完全符合规范,因为如果richtextbox 是隐藏或浮动的,则不会在顶部显示它。更不用说如果你尝试调试它,它会复制一大块 Visual Studio 的显示。

开源第三方解决方案可能没问题,寻找了一些但没有看到任何可以执行此功能的东西。Win32 API 调用将是最后的手段。

提前感谢您的任何帮助。