用DDE創建桌面快捷方式
受"用DDE連接方法向開始菜單中添加快捷方式"一文的啟發,我寫了一個可以向桌面增加快捷方式的小程序。與調用Vb5stkit.dll或Vb6stkit.dll來建立快捷方式相比,最大的特點在于避免了對該DLL文件的依賴(并不是每一臺Win9x的機上都有的這些文件的)。是不是很環保?
原理:利用Text控件的DDE在系統開始菜單中添加一個快捷方式,然后將該快捷方式剪切到桌面上來。
須解決的問題:取得系統開始菜單和桌面的路徑。這其中當然免不了要調用到API的SHGetSpecialFolderLocation 和SHGetPathFromIDList 函數。
實現步驟:
1.新建工程;
2.在表單中增加一個文本框(txtLnk)及一個命令按鈕(cmdMakeLnk);
3.加入以下代碼:
Option Explicit
Const CSIDL_DESKTOP = &H0 系統桌面
Const CSIDL_PROGRAMS = &H2 系統"開始-$#@62;程序"菜單
Private Type SHITEMID
cb As Long
abID As Byte
End Type
Private Type ITEMIDLIST
mkid As SHITEMID
End Type
Private Declare Function SHGetSpecialFolderLocation _
Lib "shell32.dll" (ByVal hwndOwner As Long, _
ByVal nFolder As Long, pidl As ITEMIDLIST) As Long
Private Declare Function SHGetPathFromIDList Lib _
"shell32.dll" Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, ByVal pszPath As String) As Long
定義取得系統特定文件夾的路徑的函數。
Private Function GetSpecialfolder(CSIDL As Long) As String
Dim lRet As Long
Dim IDL As ITEMIDLIST
Dim sPath As String
lRet = SHGetSpecialFolderLocation(100, CSIDL, IDL)
錯誤時返回非0值
If lRet = 0 Then
sPath = Space$(512)
lRet = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal sPath)
一定要刪除末尾的 0 字節。這在調用API時常常會遇到。
GetSpecialfolder = Left$(sPath, InStr(sPath, Chr$(0)) - 1)
Exit Function
End If
GetSpecialfolder = ""
End Function
Private Sub cmdMakeLnk_Click()
Dim sProgramsPath As String
Dim sDesktopPath As String
sProgramsPath = GetSpecialfolder(CSIDL_PROGRAMS)
sDesktopPath = GetSpecialfolder(CSIDL_DESKTOP)
txtLnk.LinkTopic = "Progman|Progman"
txtLnk.LinkMode = 2
格式:
"[AddItem($#@60;欲建立快捷方式的命令行(可以是文件夾)$#@62;,$#@60;快捷方式的名稱$#@62; ,[快捷方式的圖標文件],[第幾個圖標])]"
注意:
1、由于文件名是字符串,所以必須加引號,也就是以下這行命令為什么們用了兩個引號的原因
2、在"快捷方式的圖標文件"中所出現的路徑及文件必須是8.3格式,不支持長文件名。
下面假設為 C:WINDOWSCALC.EXE建立快捷方式
txtLnk.LinkExecute "[AddItem(""C:WINDOWSCALC.EXE"",""計算器"" )]"
將快捷方式移至桌面
sProgramsPath = sProgramsPath & "計算器.lnk"
sDesktopPath = sDesktopPath & "計算器.lnk"
FileCopy sProgramsPath, sDesktopPath
Kill sProgramsPath
End Sub
以上在Windows98、ME + VB5、VB6通過。有任何問題歡迎你跟我聯系[email protected]
原理:利用Text控件的DDE在系統開始菜單中添加一個快捷方式,然后將該快捷方式剪切到桌面上來。
須解決的問題:取得系統開始菜單和桌面的路徑。這其中當然免不了要調用到API的SHGetSpecialFolderLocation 和SHGetPathFromIDList 函數。
實現步驟:
1.新建工程;
2.在表單中增加一個文本框(txtLnk)及一個命令按鈕(cmdMakeLnk);
3.加入以下代碼:
Option Explicit
Const CSIDL_DESKTOP = &H0 系統桌面
Const CSIDL_PROGRAMS = &H2 系統"開始-$#@62;程序"菜單
Private Type SHITEMID
cb As Long
abID As Byte
End Type
Private Type ITEMIDLIST
mkid As SHITEMID
End Type
Private Declare Function SHGetSpecialFolderLocation _
Lib "shell32.dll" (ByVal hwndOwner As Long, _
ByVal nFolder As Long, pidl As ITEMIDLIST) As Long
Private Declare Function SHGetPathFromIDList Lib _
"shell32.dll" Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, ByVal pszPath As String) As Long
定義取得系統特定文件夾的路徑的函數。
Private Function GetSpecialfolder(CSIDL As Long) As String
Dim lRet As Long
Dim IDL As ITEMIDLIST
Dim sPath As String
lRet = SHGetSpecialFolderLocation(100, CSIDL, IDL)
錯誤時返回非0值
If lRet = 0 Then
sPath = Space$(512)
lRet = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal sPath)
一定要刪除末尾的 0 字節。這在調用API時常常會遇到。
GetSpecialfolder = Left$(sPath, InStr(sPath, Chr$(0)) - 1)
Exit Function
End If
GetSpecialfolder = ""
End Function
Private Sub cmdMakeLnk_Click()
Dim sProgramsPath As String
Dim sDesktopPath As String
sProgramsPath = GetSpecialfolder(CSIDL_PROGRAMS)
sDesktopPath = GetSpecialfolder(CSIDL_DESKTOP)
txtLnk.LinkTopic = "Progman|Progman"
txtLnk.LinkMode = 2
格式:
"[AddItem($#@60;欲建立快捷方式的命令行(可以是文件夾)$#@62;,$#@60;快捷方式的名稱$#@62; ,[快捷方式的圖標文件],[第幾個圖標])]"
注意:
1、由于文件名是字符串,所以必須加引號,也就是以下這行命令為什么們用了兩個引號的原因
2、在"快捷方式的圖標文件"中所出現的路徑及文件必須是8.3格式,不支持長文件名。
下面假設為 C:WINDOWSCALC.EXE建立快捷方式
txtLnk.LinkExecute "[AddItem(""C:WINDOWSCALC.EXE"",""計算器"" )]"
將快捷方式移至桌面
sProgramsPath = sProgramsPath & "計算器.lnk"
sDesktopPath = sDesktopPath & "計算器.lnk"
FileCopy sProgramsPath, sDesktopPath
Kill sProgramsPath
End Sub
以上在Windows98、ME + VB5、VB6通過。有任何問題歡迎你跟我聯系[email protected]