VB创建快捷方式方法-总结篇
设为首页 加入收藏
本站软件 请您留言
您当前位置:网站首页 >> 技术文档 >> VB >> 文章列表

VB创建快捷方式方法-总结篇

来源:chinalaohu 发布时间:2009-3-21 16:13:53 查看次数:

快捷方式大家都很熟悉。对于Windows来说,快捷方式提供一种快速启动程序、打开文件或文件夹的方法。从其本质来说,快捷方式通常就是一种文件,对于链接到文件夹和文件来说,其扩展名为Lnk,但对于链接到网页的快捷方式,其扩展名为URL。然而,它也是一种特殊的文件,因为在Windows中,即使你取消文件夹选项中"隐藏已知文件类型的扩展名"这个选项后,在Windows中,仍然看不到扩展名Lnk。其实不显示这对于Windows来说,完全是正常现象,假如看得见扩展名的话,说明你的系统设置出了问题。


做好的程序,发布的时候,一般来说,基本借助比较专业的工具来制作安装程序。但是有时候觉得这些工具做出的安装程序不那么个性和灵活,于是,还得自己手动来开发。一般安装程序到了最后,通常的做法都是在程序组中或者在桌面上创建快捷方式。


下面在这里对VB来创建快捷方式的方法做一个阶段性的总结,说阶段性,希望大家以后发现了更好的方法,也来软件报秀一把。


方法1:引用IwshRuntimeLibrary库的WshShell类


具体做法:新建一个标准Exe工程,采用如下图所示界面:(说明:为了节省开发时间,其他几种方法均采用和这类似的界面)



接着,在VB中引用Windows Script Host Object Model组件库。为了辅助编程,还在工程中引用Microsoft Script Runtime。


接下来就是代码编写,为了实现快捷键功能,这里利用Text4控件的KeyDown事件中调用自定义Function:getkeystr的返回值来实现。


Function getkeystr(shift As Integer, keyvalue As Integer) As String


Dim ShiftDown, AltDown, CtrlDown, Txt


Select Case keyvalue


Case 13


getkeystr = "Enter"


Case 27


getkeystr = "Esc"


Case 65 To 90


getkeystr = Chr(keyvalue)


Case 112 To 123


getkeystr = "F" + CStr(keyvalue - 111)


End Select



ShiftDown = (shift And vbShiftMask) > 0


AltDown = (shift And vbAltMask) > 0


CtrlDown = (shift And vbCtrlMask) > 0


If ShiftDown And CtrlDown And AltDown Then


Txt = "SHIFT+CTRL+ALT+"


……


Txt = "CTRL+"


ElseIf AltDown Then


Txt = "ALT+"


End If


If Txt <> "" And getkeystr = "" Then getkeystr = "单纯的控制键没有意义!": Exit Function


getkeystr = Txt + getkeystr


End Function


创建快捷方式通过Create_ShortCut过程来实现:


Private Sub Create_ShortCut(exepath As String, lnkpath As String, targetpath As String, hotkey As String)


Dim objWSH As IWshRuntimeLibrary.WshShell


Dim ObjShortCut As IWshRuntimeLibrary.WshShortcut


Dim fso As New FileSystemObject


If fso.FileExists(exepath) = True And fso.FolderExists(targetpath) = True Then


Set objWSH = New IWshRuntimeLibrary.WshShell


Set ObjShortCut = objWSH.CreateShortcut(lnkpath) '调用WshShell对象的CreateShortcut方法


ObjShortCut.targetpath = exepath '目标路径


ObjShortCut.WorkingDirectory = targetpath '对应快捷方式属性的起始位置(工作路径)


ObjShortCut.hotkey = hotkey '对应快捷方式属性的热键


ObjShortCut.Save '保存快捷方式


If fso.FileExists(lnkpath) = True Then MsgBox "快捷方式创建成功!", vbInformation, "祝贺!!" '通过快捷方式文件是否产生来判断是否创建成功


End If


End Sub


剩下的工作,就是在创建按钮中传递参数给该过程了。



方法2:DDE指令传递


DDE,Dynamic Data Exchange。中文全称是动态数据交换。在VB中,通过其专用的DDE指令实现与Windows的交互。


其中和本例相关的可用指令有以下几种:


CreateGroup(GroupName,GroupPath) '创建程序组,第一个参数为程序组的名称,第二个参数指定程序组的路径


ShowGroup(GroupName,ShowCommand) '显示程序组


AddItem(CommandLine,Name,IconPath,IconIndex,XPos,YPos) '增加快捷方式到由Name制定的程序组下


DeleteGroup (GroupName) '删除名称为GroupName的程序组


由于DDE指令,限定快捷方式只能在程序组中实现。为了实现其在任意路径中创建的目的,我们利用API函数SHGetSpecialFolderLocation和SHGetPathFromIDList获得系统的启动路径,把该路径存放在变量中。然后利用DDE命令ShowGroup显示启动组 ,利用AddItem在启动组中创建快捷方式,接着把该快捷方式复制到我们自定义的路径,最后将启动组的快捷方式删除。要实现DDE命令的执行,我们只需在VB工程中添加一个文本框,文本框有一个LinkExecute的方法,该方法可以实现DDE命令与系统的交互。


代码参考Create_ShortCut过程,如下:


SHGetSpecialFolderLocation 0, STARTUP, pidl


SHGetPathFromIDList pidl, sTmp


StartPath = Left(sTmp, InStr(sTmp, Chr(0)) - 1)


Text3.LinkTopic = "ProgMan|Progman" '注意大小写


Text3.LinkMode = 2 ''采用人工方式建立连接


Text3.LinkExecute "[ShowGroup(启动,8)]" ' 显示windows启动组


Text3.LinkExecute "[AddItem(" + exepath + "," + Split(fso.GetFileName(lnkpath), ".lnk")(0) + ")]" ' 添加一个快捷方式到该程序组中


If fso.FileExists(StartPath + "\" + fso.GetFileName(lnkpath)) = True Then


If fso.FileExists(lnkpath) = True Then fso.DeleteFile lnkpath


fso.MoveFile StartPath + "\" + fso.GetFileName(lnkpath), lnkpath


End If


'On Error Resume Next '


Text3.LinkMode = 0 '



方法3:采用STKIT432.DLL


STKIT432.DLL中函数包含fCreateShellGroup/ fCreateShellLink/ fRemoveShellLink等API函数,可以和定义其他Windows API函数一样,在VB中声明后直接拿来使用。


但是要使用该STKIT432.DLL之前,最好先要注册。并且要获得该DLL文件的最新版本或者可使用版本。低版本可能导致这些API函数不能使用或者使用异常。


fCreateShellLink函数定义如下:


Private Declare Function fCreateShellLink Lib "STKIT432.DLL" _


(ByVal lpstrFolderName As String, ByVal lpstrLinkName As String, _


ByVal lpstrLinkPath As String, ByVal lpstrLinkArguments As String) As Long包含四个参数:


作用:创建快捷方式


说明:该函数包含四个参数,第一个参数指定创建的路径,


'假如第一个参数为空,则在开始菜单下程序组中创建快捷方式


'假如指定第一个参数值为"..\..Desktop",则在桌面上创建


'函数执行成功,返回一个非0的值


'如果执行失败,返回0


核心代码依然放在过程Create_ShortCut中,如下:


lRet = fCreateShellLink("", Shortcut_Name, exepath, "")


If lRet Then


Dim sTmp As String * MAX_LEN '存放结果的固定长度的字符串


Dim nLength As Long '字符串的实际长度


Dim pidl As Long '某特殊目录在特殊目录列表中的位置


Dim ProgramPath As String, shortpath As String * 260


SHGetSpecialFolderLocation 0, PROGRAMS, pidl


SHGetPathFromIDList pidl, sTmp


ProgramPath = Left(sTmp, InStr(sTmp, Chr(0)) - 1)


If fso.FileExists(ProgramPath + "\" + fso.GetFileName(lnkpath)) = True Then


If fso.FileExists(lnkpath) = True Then fso.DeleteFile lnkpath


fso.MoveFile ProgramPath + "\" + fso.GetFileName(lnkpath), lnkpath


End If


MsgBox "创建成功!", vbInformation, "祝贺"


Else


MsgBox "创建失败!", vbInformation, "警告"


End If



方法4:采用SHELLLNK.TLB组件


SHELLLNK组件库是专门为创建快捷方式而设计的,功能全面。一般我们在桌面上选中一个快捷方式的属性可以看到,一个快捷方式包含的可设置属性其实有:目标,即应用程序或文件夹路径;起始位置,一般对应目标的不含文件名的路径;快捷键,对于启动快捷方式的热键;窗口运行模式:对应程序运行的界面是以最大化窗口、最小化或正常窗口方式运行;甚至还包含备注。


和引用其他组件的方法一样,直接将SHELLLNK.TLB文件引用到VB组件库列表中。具体操作是,在VB工程中,点击工程菜单-引用菜单项,打开引用窗口,发现IshellLinkA Interface库不在列表中,这时,点击浏览窗口,将文件定位到SHELLLNK.TLB后,这时,发现列表中出现IshellLinkA Interface项目,勾选后,确定即可。


核心代码仍然放在过程Create_ShortCut,只不过该过程包含9个参数,其中前面两个参数为必须,后7个参数为可选,如下:


Dim m_ShellLink As ShellLinkA


Dim PersistFile As IpersistFile


……


Set m_ShellLink = New ShellLinkA '


Set PersistFile = m_ShellLink


With m_ShellLink


'设置快捷方式对应的目标路径


.SetPath exefile


'设置工作路径(起始路径)


If sWorkDir <> "" Then .SetWorkingDirectory sWorkDir


'添加命令行参数


If sExeArgs <> "" Then .SetArguments sExeArgs


'设置描述文本


.SetDescription description & vbNullChar


'设置热键


.SetHotkey slng


'设置图标索引


If sIconFile <> "" Then .SetIconLocation sIconFile, lIconIdx


'设置程序窗口的运行模式(最大化、最小化、正常窗口)


.SetShowCmd ShowCmd


End With


m_ShellLink.Resolve 0, SLR_UPDATE


PersistFile.Save StrConv(lnkFile, vbUnicode), 0 '保存快捷方式文件


Create_ShortCut = True '返回为真



方法5:VB+VC混合编程


这种方法主要思路就是利用VC6创建一个ATL(活动模板库),生成一个dll文件,将创建快捷方式的代码集成在该DLL中,最后在VB中调用该DLL中对应的函数。


实现步骤如下:


VC6:


第一步 运行 ATL-COM 向导将项目名称保存为:shelllink。


在向导设置过程中,有几个地方需要强调一下:Server Type选择Dynamic Link Library(动态链接库)。其他三个选项,和本项目无关,不用选择。设置好了,点击完成。


第二步:创建一个新的ATL对象。


默认情况下,工作区工具栏是集成在设计环境的左侧,但假如工作区工具栏看不到,这时可以将鼠标放在标准工具栏上滚动,但提示有Workspace字样的按钮时,点击一下即可看到。该工具栏包含有ClassView、Resources和FileView三部分,将鼠标在ClassView上点击右键,在弹出式菜单中选择New ATL Object(新ATL对象),弹出如下ATL对象向导对话框:



采用默认设置 (Simple Object)下一步弹出ATL对象属性对话框,在ShortName输入Ishellk,其他采用默认设置,设置好后确定。


这样就工程中创建了一个ATL对象。


第三步 添加方法


我们可以通过右键点击"Ishellk",在弹出的菜单中,选择"Add Method".这时弹出"添加方法到界面"对话框,可以根据如图的参数输入,如下:



确定后,在工程中双击CreateLink(LPCSTR exepath, BSTR LnkFilePath, BSTR *Returnvalue),注意前面图标为红书。


打开后展开了一个CreateLink过程,我们可以将创建快捷方式的代码添加到这里。注意:由于我们需要引用IshellLink接口和IpersistFile接口。因此,需要将这些接口的定义文件引用头文件中。于是我们在shellk.h中添加如下代码:


#include "SHLGUID.H" //添加包含IshellLink和IpersistFile接口的参数定义文件


#include "shlobj.h" //添加包含IshellLink和IpersistFile接口的定义文件


然后我们就可以添加如下代码到CreateLink中


IShellLink * shell_link;


IPersistFile * i_PF;


// 初始化COM库(让Windows 加载DLLs)


CoInitialize (NULL);


// 创建COM对象


HRESULT hr = CoCreateInstance (CLSID_ShellLink,


NULL,


CLSCTX_INPROC_SERVER,


IID_IShellLink,


(void**)&shell_link);


if (SUCCEEDED(hr))


{


// 设置快捷方式目标的路径。


hr = shell_link->SetPath(exepath);


if (SUCCEEDED(hr))


{


// 获取这个对象的第二个接口(IPersistFile)。


hr = shell_link->QueryInterface(IID_IPersistFile, (void**)&i_PF);


if (SUCCEEDED(hr))


{


//调用Save()方法保存某个文件得快捷方式。第一个参数是 Unicode 串。


hr = i_PF->Save(LnkFilePath, FALSE);


//释放IPersistFile接口。


i_PF->Release();


}


}


//释放IShellLink接口。


shell_link->Release();


}


// 释放COM库


CoUninitialize();


return S_OK;


按Ctrl+F5编译本项目,生成shelllink.dll.


接下来的工程,就是在VB中引用该shelllink.dll库。


VB中引用dll中CreateLink方法如下:


Dim x As shellk


Dim rt As String


Set x = New shellk


x.CreateLink Text1.Text, Text2.Text, rt


详情请参阅源代码。


以上方法均在XP/VB6/VC6测试环境中调试通过。

相关文章
文章评论

联系方式:Email:weifeng3000@163.com     QQ:95253216
Copyright all rights reserved     鄂ICP备08101179号
Powered by chinalaohu
联系我们:联系我们