快捷方式大家都很熟悉。对于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测试环境中调试通过。