在VB.NET中实现文件的拖放

本文介绍了在VB.NET中如何实现接受拖放的文件,即从资源管理器中拖放到应用程序中的时候,自动获取拖放的文件。文中的例子是一个接受拖放文件显示文件内容的VB.NET实例程序。
引言:

对于文本格式的文件,我们可以直接拖到记事本中就可以看到内容;各种类型的图片,拖到Photoshop中,就可以直接对其编辑。我们如何在VB.NET开发的程序也实现上述效果呢?

思路:

我们知道,每一个Windows的应用程序都有一个消息队列,程序的主体接受系统的消息,然后分发出去(给一个form,或者一个控件),接受者有相应的程序来处理消息。在.NET的Form中,默认情况下程序是不翻译这些消息的,也就是说默认我们的Class是不加入应用程序的消息泵。能不能把我们的Form Class加入应用程序的消息泵呢?可以!

在.NET中,任何一个实现IMessageFilter 接口的类,可以添加到应用程序的消息泵中,以在消息被调度到控件或窗体之前将它筛选出来或执行其他操作。使用 Application 类中的 AddMessageFilter 方法,可以将消息筛选器添加到应用程序的消息泵中。

于是我们在程序加载的时候,调用Application.AddMessageFilter(Me)。然而,默认情况下一个Form或者控件是不能接受拖放的文件的,我们调用一个WIN32 API DragAcceptFiles,这个API可以设置对应的控件是否能接受拖放的文件。然后可以用DragQueryFile查询拖放到的文件列表,也就是拖放文件地具体路径和文件名。

代码:

Imports System.Runtime.InteropServices

Public Class Form1

Inherits System.Windows.Forms.Form

Implements IMessageFilter

‘ API申明

Const WM_DROPFILES = &H233 ‘拖放文件消息

<DllImport("shell32.dll")> Public Shared Sub DragFinish(ByVal hDrop As Integer)

End Sub

<DllImport("shell32.dll")> Public Shared Sub DragAcceptFiles(ByVal hwnd As Integer, ByVal fAccept As Boolean)

End Sub

<DllImport("shell32.dll")> Public Shared Function DragQueryFile(ByVal HDROP As Integer, ByVal UINT As Integer, ByVal lpStr As System.Text.StringBuilder, ByVal ch As Integer) As Integer

End Function

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Application.AddMessageFilter(Me)

DragAcceptFiles(TextBox1.Handle.ToInt32, True)

End Sub

Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage

If m.Msg = WM_DROPFILES Then

'设置拖放的动作

Dim nfiles As Int16

nfiles = DragQueryFile(m.WParam.ToInt32, -1, Nothing, 0)

Dim i As Int16

Dim sb As New System.Text.StringBuilder(256)

Dim sFirstFileName As String '记录第一个文件名

TextBox1.Clear()

For i = 0 To nfiles - 1

DragQueryFile(m.WParam.ToInt32, i, sb, 256)

If i = 0 Then sFirstFileName = sb.ToString

TextBox1.AppendText(ControlChars.CrLf & sb.ToString)

Next

DragFinish(m.WParam.ToInt32) '拖放完成

'显示文件内容

Dim fs As New System.IO.FileStream(sFirstFileName, IO.FileMode.Open)

Dim sr As New System.IO.StreamReader(fs, System.Text.Encoding.GetEncoding("gb2312"))

TextBox1.AppendText(ControlChars.CrLf & sr.ReadToEnd().ToString)

fs.Close()

sr.Close()

End If

Return False

End Function

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then

If Not (components Is Nothing) Then

components.Dispose()

End If

End If

Application.RemoveMessageFilter(Me)

DragAcceptFiles(TextBox1.Handle.ToInt32, False)

MyBase.Dispose(disposing)

End Sub

注意:拖放结束后,调用DragFinish释放内存。

时间: 2024-10-25 13:03:42

在VB.NET中实现文件的拖放的相关文章

求在vb.net中实现文件搜索的代码

问题描述 如题.请哪位高手给我一个在vb.net中实现文件搜索的代码,就好像是WINDOWS里面的搜索那样的东西. 解决方案 解决方案二:不知道系统是怎么做的.比如搜索.doc文档就不知道如何做好些.解决方案三:PrivateSubgetFiles(ByValdirAsScripting.Folder)DimnodeAsTreeNodeDimfilesAsScripting.Files=dir.FilesDimfileAsScripting.FileDimfileNameAsStringDimi

VB.NET中监视文件夹的变化

摘要 :        有时候,处于业务的需要,我们要不断的监视文件的变化,比如文件的创建.删除.重命名等:而且某些人要确保重要文件的只读,并且要及时的报告文件版本的变更情况.或者,你想监视你的文件夹被别人更改.肆意删除而又不知道是谁干的,在什么时候干的?于是你就考虑要写一个监视程序,"偷偷的"记录文件夹被操作的情况.        有些人采取常规的方式,即写一个桌面应用程序,其界面可能是隐藏的.采用每隔一个事件片段读取文件信息,然后写到一个log文件中.然后设置系统启动的事件自动加载

在VB.NET中实现拖放操作

第一次在csdn上发文章,希望大家帮忙使劲顶,鼓励一下新手,谢谢 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchImpDragDrop.asp 在VB.NET中实现拖放操作 Implementing Drag and Drop in Visual Basic .NET Steve Hoag Visual Basic .NET Team Microsoft Corpor

托拽Explore中的文件到VB.net的窗口 40Star(原作)

托拽Explore中的文件到VB.net的窗口    40Star(原作)    关键字     WM_DROPFILES VB.net    要让VB.net相应外部托拽来的文件,需处理WM_DROPFILES消息. Private Declare Sub DragAcceptFiles Lib "shell32.dll" (ByVal hWnd As Int32, ByVal fAccept As Int32)Private Declare Sub DragFinish Lib &

VB.NET中读取INI文件设置信息函数sdGetIniInfo

函数 虽然VB.NET中读取XML配置信息很方便,但有时开发的过程中还是要用到INI文件,在VB.NET中读取INI却不像VB中那么方便了,刚才写了个函数,现贴出来,也许各位能用得上.     '函数名: sdGetIniInfo    '功能:读取INI文件设置信息    '参数说明:iniFile-->INI文件     iniSection--INI文件中设置的部分名称    '作者:SD    '日期:2005-10-11    'Email:ztqas@126.com    '备注:转

.net入门之VB篇:Visual Basic.Net中的文件操作(一)

visual Visual Basic.Net中有三种访问文件系统的方法:第一种是使用 Visual Basic 运行时函数进行文件访问 (VB传统方式直接文件访问):第二种是通过.Net中的System.IO模型访问:第三种是通过文件系统对象模型FSO访问. 文件是存储在某种介质上数据的集合,就其本身来讲,文件只不过是磁盘上的一系列相关的数据字节.当应用程序访问文件时,它必须假定字节是否表示字符.数据记录.整数.字符串等.通过指定文件的访问类型来告诉应用程序假定什么内容. Visual Bas

在VB项目中使用资源文件

项目 很多VB项目使用的数据存储在扩展文件中,包括bmp图片,icons图标,指针和wav文件.在你的安装中这些元素作为分开的单独文件有两个缺点. 首先,它可能在大量的文件中混乱安装:但是,如果一个用户删除或者不经意的移动文件中的任何内容,程序就不会正常运行.第二,文件中的材料对于用户来说使用是非常自由的,有可能用户所使用的方法是你不希望的. 你可以使用资源文件来避免上面的这些问题.使用资源文件的另外一个好处就是你可以创造特别版本的资源文件包括在不同的地方安装. 一个VB项目仅仅只有一个和它相关

vb编程-vb编写让word文件在AxWebBrowser中打开

问题描述 vb编写让word文件在AxWebBrowser中打开 只能弹出打开,无法在框内显示mypath = Directory.GetCurrentDirectory() AxWebBrowser1.Navigate(mypath & ""章节文件1.docx"")该如何操作

vb.net中怎样关闭excel文件

问题描述 我要在vb.net中实现对一个存在的excel文件进行写操作.自己在调试过程中执行到xlBook.Close()这个操作的时候,就停止不动了.请问怎样关闭excel. 解决方案 解决方案二:以前写的,你可以参考你需要的部分.http://dev.csdn.net/author/lzmtw/4db1da0f4a3b489da42e33b94b2a38e2.html解决方案三:application.close解决方案四:窗体代码前定义实例对象:PrivateAppExcelAsExcel