level 1
要实现在资源管理器里双击文件时,让系统使用你和程序来打开这个文件,或用户从命令行输入参数时打开指定参数的文件,我们需要实现两个功能:一是向系统注册文件类型,就是打开方式,使用API向注册表中写入注册表信息二是在程序中使用Command()函数获得命令行参数,但要注意,当用户是双击文件来打开的,那么此参数是被一对双引号引起来的字符串,我们需要先替换双引号(你放心,一个合法的文件名和路径是不会有双引号的),并加载此文件内容即可另外,从资源管理器里双击文件来的打开文件时,获得的文件名当然肯定是一个文件名,但是,当用户从命令行输入命令时,可以输入多个,如:我的记事本.exe c:\autoexec.bat d:\abc.txt,此时获得的参数实际上是两个参数,如果直接使用这参数当文件名打开时,会找不到文件,我们需要使用Split()函数分隔参数(分隔字符为空格)但还有一个问题,当文件名或路径中包含空格时,用户输入路径时需要将文件完整路径使用双引号引起来如:我的记事本.exe "D:\Program Files\Microsoft Visual Studio\VB98\NWIND.MDB"这时如果直接使用空格分隔就有问题,在这里,其实我们只传了一个文件名,但使用空格分隔就会分出四个参数来我现在的示例并没有考虑以上两个问题以下是源代码,要的也可以留下邮箱工程中有一个窗体:frmEdit,窗体上有一个TextBox控件:txtText(为了配合以下代码,或者你可以将以下代码中的控件、窗体名称改成你的)还有一个模块,名字随便'模块代码部分Option ExplicitPrivate Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _ ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As LongPrivate Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" ( _ ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _ lpType As Long, lpData As Any, lpcbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value.Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" ( _ ByVal hKey As Long, ByVal lpszSubKey As String, lphKey As Long) As LongPrivate Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" ( _ ByVal hKey As Long, ByVal lpszSubKey As String, ByVal fdwType As Long, _ ByVal lpszValue As String, ByVal dwLength As Long) As Long Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As LongPrivate Const ERROR_SUCCESS = 0&Private Const ERROR_BADDB = 1&Private Const ERROR_BADKEY = 2&Private Const ERROR_CANTOPEN = 3&Private Const ERROR_CANTREAD = 4&Private Const ERROR_CANTWRITE = 5&Private Const ERROR_OUTOFMEMORY = 6&Private Const ERROR_INVALID_PARAMETER = 7&Private Const ERROR_ACCESS_DENIED = 8&Private Const HKEY_CLASSES_ROOT = &H80000000Private Const HKEY_LOCAL_MACHINE = &H80000002Private Const MAX_PATH = 256&Private Const REG_SZ = 1Private Const RFT_APP_NAME = "我的记事本"Private Const RFT_FILE_TYPE = "ZZZfiles"Private Const RFT_FILE_EXT_NAME = ".zzz"Public strCmdLine As String'注册文件类型,这里每次运行都会去注册,
2006年12月11日 16点12分
1
level 1
'原来想的先检查,如果没有注册或被修改了才重新注册,'但这样反而多了一事,既要检查,同样还是要修改,'所以,干脆不检查,直接修改Private Sub RegFileType() Dim sKeyValue As String '键值 Dim ret As Long '返回错误信息的变量 Dim lphKey As Long '此变量用来保存创建的键的句柄 '实际效果是在注册表的HKEY_CLASSES_ROOT下创建MyApp目录 '* 名为“我的记事本”的键名 '* 把键值设为"ZZZfiles" '在HKEY_CLASSES_ROOT中创建名为sKeyName的键并返回句柄lphKey ret = RegCreateKey(HKEY_CLASSES_ROOT, RFT_APP_NAME, lphKey) '向句柄lphKey& 所指的位置写入键值sKeyValue ret = RegSetValue(lphKey, "", REG_SZ, RFT_FILE_TYPE, 0&) '在注册表的HKEY_CLASSES_ROOT下创建另外一个目录 .Log '* 名为.zzz的键名 '* 把键值设为“我的记事本” ret = RegCreateKey(HKEY_CLASSES_ROOT, RFT_FILE_EXT_NAME, lphKey) ret = RegSetValue(lphKey, "", REG_SZ, RFT_APP_NAME, 0&) '为“我的记事本”设置了一个命令行 '* 名为“我的记事本”的键名 sKeyValue = App.Path & "\" & App.EXEName & ".exe %1" '*把键值设为"notepad.exe %1"如果你知道DOS下的.Bat文件的语法的话便知%1指的是要打开的文件 '如果该键已经创建则RegCreateKey那么函数会打开现有的项 ret = RegCreateKey(HKEY_CLASSES_ROOT, RFT_APP_NAME, lphKey) '下面一句的实际效果是在“我的记事本”键下建立shell\open\command目录并写入键值sKeyValue '说明:放在一个键的shell\open\command下的是打开某一类型文件的应用程序的名称 ret = RegSetValue(lphKey, "shell\open\command", REG_SZ, sKeyValue, MAX_PATH) ret = RegCloseKey(lphKey)End SubPrivate Sub GetCmdLine() strCmdLine = Replace(Command(), """", "") '双击文件时的参数是带双引号的字符串End SubPublic Sub Main() Call RegFileType '注册文件类型 Call GetCmdLine frmEdit.ShowEnd Sub'窗体代码部分Option ExplicitPrivate Sub Form_Load() Show DoEvents Call LoadFile(strCmdLine) '加载命令行获取的文件名End SubPrivate Sub Form_Resize() If WindowState = vbMinimized Then Exit Sub txtText.Move 0, 0, ScaleWidth, ScaleHeightEnd Sub'加载指定的文件Private Sub LoadFile(Optional ByVal strpath As String = vbNullString) Dim fn As Integer, bytData(1023) As Byte, strData As String If Len(strpath) = 0 Then Exit Sub If Dir(strpath, vbNormal) = Empty Then Exit Sub txtText.Text = vbNullString fn = FreeFile() On Error GoTo TrackErr Open strpath For Binary As #fn While Not EOF(fn) Get #fn, , bytData strData = strData & StrConv(bytData, vbUnicode) Wend Close #fn txtText.Text = strData Exit SubTrackErr: MsgBox "打开文件错误:" & Err.Description, vbCritical, "文件错误!" Err.ClearEnd Sub
2006年12月11日 16点12分
2
level 1
'此为修改过后的注册文件类型的过程,加了设置文件图标和默认为打开的注册信息Private Sub RegFileType() Dim sKeyValue As String '键值 Dim ret As Long '返回错误信息的变量 Dim lphKey As Long '此变量用来保存创建的键的句柄 '实际效果是在注册表的HKEY_CLASSES_ROOT下创建MyApp目录 '* 名为“我的记事本”的键名 '* 把键值设为"ZZZ 文件" '在HKEY_CLASSES_ROOT中创建名为sKeyName的键并返回句柄lphKey ret = RegCreateKey(HKEY_CLASSES_ROOT, RFT_APP_NAME, lphKey) '向句柄lphKey& 所指的位置写入键值sKeyValue ret = RegSetValue(lphKey, "", REG_SZ, RFT_FILE_TYPE, 0&) '在注册表的HKEY_CLASSES_ROOT下创建另外一个目录 .Log '* 名为.zzz的键名 '* 把键值设为“我的记事本” ret = RegCreateKey(HKEY_CLASSES_ROOT, RFT_FILE_EXT_NAME, lphKey) ret = RegSetValue(lphKey, "", REG_SZ, RFT_APP_NAME, 0&) '为“我的记事本”设置了一个命令行 '* 名为“我的记事本”的键名 sKeyValue = App.Path & "\" & App.EXEName & ".exe %1" '*把键值设为"notepad.exe %1"如果你知道DOS下的.Bat文件的语法的话便知%1指的是要打开的文件 '如果该键已经创建则RegCreateKey那么函数会打开现有的项 ret = RegCreateKey(HKEY_CLASSES_ROOT, RFT_APP_NAME, lphKey) '下面一句的实际效果是在“我的记事本”键下建立shell\open\command目录并写入键值sKeyValue '说明:放在一个键的shell\open\command下的是打开某一类型文件的应用程序的名称 ret = RegSetValue(lphKey, "shell\open\command", REG_SZ, sKeyValue, MAX_PATH) '文件图标 sKeyValue = App.Path & "\" & App.EXEName & ".exe,0" '取当前程序的图标 ret = RegSetValue(lphKey, "DefaultIcon", REG_SZ, sKeyValue, MAX_PATH) '默认为打开 ret = RegSetValue(lphKey, "shell", REG_SZ, "open", MAX_PATH) ret = RegCloseKey(lphKey)End Sub
2006年12月12日 15点12分
4
level 0
支持,问下楼住如果双击打开文件后,要如何显示打开文件的内容呢?
2007年01月07日 12点01分
10
吧务
level 7
当双击文件时会向程序传一个命令行参数(文件的路径),用Command函数来获取。如:Private Sub Form_Load()Me.Caption=CommandEnd Sub这样窗体的标题就是文件的路径了,如果你运行的是程序,那么窗体的标题就是一个空字符串。
2007年01月07日 13点01分
11
level 5
呵呵 看不明白我直接盗用别人的代码用子程序 RunFile() 搞定了......
2007年01月07日 13点01分
12
level 1
楼主给我一份我正找呢,tjx12222163.com
2007年01月07日 13点01分
13
level 1
要被打开的文件的路径都给了你了,怎么打开这个文件获得文件内容还要教你吗?与你其它方式打开文件是一样的,没有区别!
2007年01月07日 14点01分
14
level 1
Private Sub SetFileType(ByVal strFileType As String, ExePathFile As String) Dim Length As Integer Dim KeyId As Long Call RegCreateKey(HKEY_CLASSES_ROOT, "." & strFileType, KeyId) Call RegSetValueEx(KeyId, "", 0&, REG_SZ, ByVal strFileType & "file", MAX_PATH) Dim KeyId1 As Long Call RegCreateKey(HKEY_CLASSES_ROOT, strFileType & "file", KeyId1) Call RegSetValueEx(KeyId1, "", 0&, REG_SZ, ByVal strFileType & "类型", MAX_PATH) Dim KeyId2 As Long Call RegCreateKey(KeyId1, "DefaultIcon", KeyId2) Call RegSetValueEx(KeyId2, "", 0&, REG_SZ, ByVal ExePathFile & ",0", MAX_PATH) Dim KeyId3 As Long Call RegCreateKey(KeyId1, "Shell", KeyId3) Dim KeyId4 As Long Call RegCreateKey(KeyId3, "Open", KeyId4) Dim KeyId5 As Long Call RegCreateKey(KeyId4, "command", KeyId5) Call RegSetValueEx(KeyId5, "", 0&, REG_SZ, ByVal ExePathFile & " %1", MAX_PATH) Call RegSetValue(KeyId1, "shell", REG_SZ, "open", MAX_PATH) Call RegCloseKey(KeyId1) Call RegCloseKey(KeyId2) Call RegCloseKey(KeyId3) Call RegCloseKey(KeyId4) Call RegCloseKey(KeyId5) MsgBox "创建自定义类型后缀名成功。", vbInformation, "系统提示" End Sub恩,不用发了,已经弄出来了,昨天没调出来所以想看你怎么编的.我调用上面的程序后可以关联了,但是图标还是没改变,这个图标有什么另外的要求吗?看系统记事本的这个键值是调用DLL.
2007年01月08日 13点01分
15
level 1
回10楼上面的代码中,有你要的加载文件内容,你再仔细看一下?!调用了这行代码Call LoadFile(strCmdLine) '加载命令行获取的文件名回12楼程序从Sub Main开始运行Public Sub Main() Call RegFileType '注册文件类型 Call GetCmdLine frmEdit.Show End Sub首先,去注册文件类型然后获得了命令行传入的文件名再加载窗体而在窗体加载中Private Sub Form_Load() Show DoEvents Call LoadFile(strCmdLine) '加载命令行获取的文件名 End Sub就调用了LoadFile过程去打开文件并加载文件内容到窗体里的文本框中
2007年01月08日 16点01分
16
level 13
哎, 我爱舞女泪 你还没习惯VB吧就是这样啊 ? 我早就麻痹啦....
2007年03月10日 13点03分
18