CSharp Tips:Drag & Drop的高级应用

C#【必备技能篇】Marshal是什么?怎么用? 阅读详情

昨天,有同事问了我一个问题,这个问题的第一种描述方式是“怎么利用拖放的方式把一个进程中的流传递到第二个进程中”;第二种描述方式是“把应用程序中的数据(文件/流)通过拖放的方式复制到桌面或者Explorer中”。看似简单的描述下面隐藏了不少东西,有点意思,于是昨晚翻了翻资料。

 

这个问题涉及到两个技术点:跨进程的大数据块的传递,Drag & Drop。

跨进程的大数据块传递不考虑管道/Socket这类直接通讯方式的话,间接方式也很多,DDE、剪贴板、文件或者内存镜像文件。DDE有点古老,我都不记得该怎么玩了。实时性要求不高的话,保存成为临时文件,将文件名传递过去,是一个无论从系统开销,还是实现上都是一个不错的选择。至于内存镜像文件,是另一个专题,不在这里赘述了。剪贴板也是个比较有趣的东西,真要说的话,也有很多话可讲,也不在这里多说了。

数据传递的方案定了,再看Drag & Drop。在MSDN中查了一下,System.Window.Form.Control下有一组和拖放相关的方法和事件,例如DoDragDrop用来作为源启动一次拖放,DragEnter、DragOver、DragDrop是作为目标处理拖放的事件。整个拖放过程就是源在拖放开始的时候提交需要拖放的数据,并指明影响方式(例如Copy、Move之类),目标在拖放被触发(Drop的时候)时获取拖放数据并且进行相应处理。数据和数据格式是通过一个叫IDataObject的接口来描述的,它用来存储数据,申明支持的数据格式,并且对数据格式进行转换。思路清楚了,关键要实现一个IDataObject。

 

回过头看我们的问题,先解决“把应用程序中的数据(文件/流)通过拖放的方式复制到桌面或者Explorer中”这种情况。写一个小例子,一个窗口上面只有一个ListBox,里面有两个元素,分别对应硬盘上的两个文件,希望在ListBox中选中一个元素拖放到桌面,就把那个元素对应的文件复制到桌面。

代码逻辑很简单,处理ListBox的鼠标事件,判断是不是满足启动拖放的条件,当启动拖放时,把当前选中的元素封装到我们定义的IDataObject中,然后调用DoDragDrop方法。问题是IDataObject如果定义?有同学就问了我怎么知道桌面(Explorer)要求的数据格式是什么?易同学就这么问过。这也很简单,只要看看桌面作为拖放源的时候生成的DataObject支持那些格式,数据是什么形式的,仿照一下就行了。

在开始正式工作之前,先在窗口的DragEnter中写一段代码,检查DataSource支持的格式,运行程序,在桌面上拖到一个我们到我们写的应用程序窗口,一看输出,居然支持8种格式。作为工程师一定要把复杂的问题变得简单,看名字一分析,有几个格式叫“FileDrop”、“FileName”、“FileNameW”,返回的数据类型是一个字符串数组,每个成员是一个文件名,不用想,就和这些格式有关。马上动手,IDataObject类的实现如下,完整代码可到此处下载。

 运行程序,拖动ListBox中的元素到桌面,成了,文件复制过去了。在进一步测试,其实只需要支持“FileDrop”的格式就可以了。

 

再看另一种情况,从自己写的一个应用程序拖放到另一个自己写的应用程序,怎么办?更好办了,双方约定一下IDataObject实现类需要支持的格式,目标应用程序在自己的DragDrop时间中获取数据再执行操作就可以了。

 

最后提一点DoDragDrop方法的第一个参数,是支持字符串类型的,MSDN提供的示例也是传递一个字符串,但是跨进程的话应该不能直接用,就算是自己的程序估计也不行,跨进程一定需要自己定义一个实现IDataObject的类,想想COM,总要做Marshal的。这段个人猜测,没有验证,供参考。

 

参考文档

Ø  Control.DoDragDrop方法

 

 

IAR9.4报错之编码方式 IAR9.40编码方式错误导致的报错 阅读详情

相关推荐

Cursor锁机了怎么办?实测这个开源插件帮你无限“续杯”,附详细安装与防踩坑指南

本文提供了Cursor锁机问题的详细解决方案,包括使用开源插件`cursor-fake-machine`修改机器标识、锁定配置文件权限以及优化使用规范。同时介绍了如何利用Cursor开发油猴脚本将微信公众号文章高效转换为Markdown格式,提升内容创作效率。

weixin_26805597的博客 766

C#实现Dev Grid拖拽移动行的方法

拖拽时带行截图效果 实现代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3

1841

微带功分器设计与ADS-EM联合仿真实战解析

本文详细解析了微带功分器设计与ADS-EM联合仿真的实战技巧,涵盖特性阻抗计算、ADS原理图设计、版图生成与EM仿真等关键步骤。通过实际案例分享,帮助工程师掌握射频电路设计中的核心技术和调试方法,提升功分器设计效率与性能。

weixin_29280219的博客 450

C#高级教程

语法上没有任何错误,只不过在运行过程由于某些原因出现了问题。转义符\n:换行(苹果系统或者控制台)\t:制表\b:删除前面的字符(注意:放在字符串的两端没有效果\r\n:换行(win系统)\:表示一个\可以这样用@"F:\fjld\fd\a\q.txt"取消在字符串中的转义作用在声明变量的最前面加const属性的作用就是保护字段、对字段的赋值和取值进行限定。属性的本质就是两个方法,一个叫get()一个叫set()。1.抽象成员必须标记为abstract,并且不能有任何实现。

学习之路,创业之光 3106

Qt实现思维导图功能5『纵向分布模式』

思维导图纵向分布模式:模式一

浮生流年的博客 1057

华为OD技术面真题 - Python开发 - 2

汇总华为OD技术面八股Python八股,高频技术真题并提供详细解答。

qq_45776114的博客 910

Marshal函数中文介绍C#

Marshal函数中文说明,用于处理托管内存和非托管内存非常有效

柏林春天的专栏 7601

simulink的电动汽车制动系统热管理仿真

本文系统研究了电动汽车制动系统热管理仿真技术。通过建立机电液多物理场耦合模型,分析了不同工况下的动态热平衡特性。提出基于MPC的动态调节和NSGA-II多目标优化算法,使电池温度波动降低60%。创新性采用石墨烯相变材料与微通道液冷复合技术,冷却系统能耗减少40%。研究构建了完整的工程验证平台,涵盖200kW电制动测试台和高精度热成像系统。展望指出,未来将结合Transformer预测和强化学习算法,进一步优化热管理策略。该研究为电动汽车制动系统热管理提供了从理论建模到工程实施的完整解决方案。

xiaoheshang_123的博客 121

C# 指针 内存控制 Marshal 内存数据存储原理

了解内存的原理 # [内存] 是由 [Key] 和 [Value] 组成的: [Key] 是 [内存地址];(在 C# 程序中用 [IntPtr] 类型表示) [Value] 是 [内存数据];(在 C# 程序中用 [byte] 类型表示) [Key] 是一个固定32位长度的二进制数;(64位的程序则是64位长度的二进制数) [Value] 是一个固定8位长度的二进制数;(这就是计算机只能存储 0 和 1,并且最小存储单位为 byte 的原因)

rcr676的博客 5750

huggingface下载提示huggingface_hub.errors.EntryNotFoundError:404 Client Error: (Request 1D: Root...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1231

6、 实时家禽健康识别与疾病检测系统的深入解析

本文深入解析了一种基于物联网的实时家禽健康识别与疾病检测系统,结合图像分析和音频分析技术,能够有效识别病鸡并防止疾病传播。文章详细介绍了系统的测试环境、数据采集与预处理方法、图像与音频分析流程,并对系统性能进行了全面评估。最后提出了未来改进方向,包括多模态融合、深度学习应用及实时性优化等。

weixin_28840811的博客 185

Csharp: TreeList Drag and Drop

/// <summary> /// https://www.codeproject.com/articles/3225/treelistview /// https://www.codeproject.com/Tips/572728/TreeListViewEx-Tree-List-and-Drag-and-Drop /// https:...

weixin_30908103的博客 330

从 AI 助手到 ADT 自动化桥梁:全面解析 Vibing Steampunk 的定位、能力边界与典型使用场合

Vibing Steampunk是一个面向SAP ABAP开发的AI自动化工具集,它通过ADT API将SAP开发能力系统化地暴露给AI助手和命令行工作流。该工具支持ECC、S/4HANA等所有启用ADT的系统,提供代码读取、修改、测试、调试等全流程自动化能力。核心功能包括AI调试、上下文压缩、ABAP语言服务、Lua脚本自动化等,并内置多重安全控制。其分层架构兼容标准ADT和WebSocket扩展,既适合AI驱动开发,也支持传统DevOps自动化,特别适用于老系统代码考古、知识接力和复杂问题诊断场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 150

C#高级--特性详解

C#高级–特性详解 一、什么是特性 1、特性定义 **特性(Attribute)**是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。 特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。 2、特性的语法 特性(Attribute)的名称和值是在方括号内规定的,

李宥的博客 2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# 学习(三)高级能力

Obsolete声明自定义特性构建自定义特性在目标程序元素上应用自定义特性通过反射访问特性这里使用到反射的知识,本节先不讲解,将会在下节讲述一个新的自定义特性需要继承true我构建了一个名为DebugInfobug 的代号编码辨认该 bug 的开发人员名字最后一次CR 该代码的日期一个存储了开发人员标记的字符串消息我们的DebugInfo类有三个用于存储前三个信息的私有属性,和一个存储消息的公共属性。所以前三个是必须的定位(positional。

RikkaTheWorld 846

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C#从入门到精通(31)—C#Marshal类用法总结

我们在C#上位机编程中,我们经常需要进行托管内存和非托管内存数据的交互,所谓托管就是内存由.NET运行时自动管理的对象,我们在C#编程中绝大多数都是涉及的托管内存,而非托管就是操作系统或其他非.NET组件直接控制的资源,常见的是调用工业相机sdk的过程中,相机厂商经常给我们返回图像数据的时候不是直接给我们返回bitmap,而是返回图像数据的地址也就是一个指针IntPtr,这个地址(指针)就是一个非托管地址,这时候就需要我们从这个非托管地址获取图像数据,所以掌握托管内存和非托管内存数据的交互是走向高级上位机软

qq_34059233的博客 2947

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C#(二) C#高级进阶

C# 中的委托(Delegate)类似于 C 或 C++ 中的函数指针,是一种引用类型,表示对具有特定参数列表和返回值类型的。简单来说,委托是一种方法的代理/中介,委托指向某个方法来实现具体的功能。委托是方法的抽象,它存储的就是一系列具有相同参数和返回值类型的方法的地址。委托的使用包括定义声明委托、实例化委托以及调用委托三个阶段,在实例化委托时,必须将委托的实例与具有相同返回值类型以及参数列表的方法相关联,这样就可以通过委托来调用方法。另外,使用委托还可以将方法作为参数传递给其他方法.........

这里是阿安的博客 9417

C#高级--常用数据结构

C#高级–常用数据结构 零、文章目录 一、常见的数据结构 1、集合[Set] 2、线性结构 3、树形结构 4、图形结构 二、Array/ArrayList/List 内存上连续存储,节约空间,可以索引访问,读取快,增删慢 1、Array 元素类型是一样的,定长 int[] list = new int[3]; list[0] = 123; string[] stringArray = new string[] { "123", "234" }; for (int i = 0; i < list.Le

李宥的博客 9884

C# Marshal类 两个方法StructureToPtr和PtrToStructure实现序列化和反序列化

序列化和反序列化。

明仔丶的博客 3044

全面掌握C#中的拖放操作

随着桌面系统的推出,利用鼠标的拖放(Drag and Drop)操作由于其简单、直接,受到了越来越多的读者的欢迎,为迎合这种趋势,越来越多程序员在自己的程序中使用了拖放操作。拖放操作方便了程序的使用者,但由于拖放操作在程序中的设计工作比较还有点麻烦,甚至是一个难点,许多程序员对其都有点心有余悸。本文就结合微软公司最新的.Net程序开发语言...

weixin_34106122的博客 352

C# 拖放操作

拖放

钢铁男儿 2424

2023最新高级难度C#面试题,包含答案。刷题必备!记录一下。

装箱和拆箱是C#中的一个重要概念,它涉及到值类型和引用类型之间的转换。装箱是指将值类型的数据转换为其对应的引用类型的过程。在这个过程中,会在托管堆上分配一块内存用来存储值类型的实例,并返回一个指向这块内存的新对象引用。// 这里发生了装箱操作拆箱则是将引用类型的数据还原为其原始值类型的过程。在这个过程中,会检查对象引用是否真的指向一个有效且正确的值类型实例,然后将其内容复制到新的值类型变量中去。// 这里发生了拆箱操作装箱和拆箱会对程序的性能产生一定的影响。

m0_62946064的博客 3972

C# 高级使用

1.牛逼的泛型类扩展方法: /// <summary> /// T为基础数据类型 /// (可空的 时间,数字,字符串) /// </summary> /// <typeparam name="T"></typeparam> /// &...

闫创新的博客 1832

C#之高级进阶

从急速入门到面向对象,课程是否为你打开了新世界的大门呢,C# 高级课程来了,各种高阶知识点,干货噻到爆。开启你的大神之路吧,同学~ C#语言系列课程分为一下几个部分:1.C#急速入门        https://edu.youkuaiyun.com/course/detail/205892.C#之面向对象https://edu.youkuaiyun.com/course/detail/266413.C#高级进阶(本课程)4.程序员内功修炼 - 数据结构(C#)https://edu.youkuaiyun.com/course/detail/10505

C# 语言的高级应用

例1:属性概念的引入(问题) 例2:问题的解决(Java语言解决该问题的方案) 例3:属性的提出 说明:C#在声明data时就可以定义、方法。例4:属性的简化 说明:属性可以看作是对私有数据部分增加的一层隔离。2.1 定义是集合类中的一种特殊属性,可使得集合类中的元素像数组元素一样访问。2.2 语法结构 例5:利用索引器实现对集合类中元素的访问。 3、接口 3.1 概念3.2 表示例6:根据类图利用实现接口 例7:利用接口实现“饲养系统”某饲养员(Raiser)在目前状态下需要饲养三种动物

老马的程序人生 1334

c#学习

简介 C#读作C Sharp。最初它有个更酷的名字,叫做COOL。微软从1998年12月开始了COOL项目,直到2000年2月,COOL被正式更名为C#。在1998年,Delphi语言的设计者Hejlsberg带领着Microsoft公司的开发团队,开始了第一个版本C#语言的设计。在2000年9月,国际信息和通信系统标准化组织为C#语言定义了一个Microsoft公司建议的标准。最终C#语言在2

u011655372的专栏 898
上一篇: 从招聘人员的角度看简历撰写
下一篇: CSharp Tips:Delegate成员变量和Event的区别
Mittermeyer
博客等级 码龄25年 60粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值