Programmatically PIN shortcut onto Taskbar on Win7

During my work I got one requirement of pinning a specific shortcut file (*.lnk) onto the Windows 7 Taskbar, after investigating I found programmtically achive this is “not permitted”, refer MSDN article: http://msdn.microsoft.com/en-us/library/dd378460(VS.85).aspx

A small set of applications are pinned by default for new installations. Other than these, only the user can pin further applications; programmatic pinning by an application is not permitted.

However, the exception comes from Windows Script Hosting, a snippet of VBscript can achieve my requirement, I read several articles (refer the end of this post) and wrote two VBS scripts showing below:

Pin to Taskbar

Option Explicit

'Const CSIDL_COMMON_PROGRAMS = &H17
Dim ShellApp, FSO, Desktop
Set ShellApp = CreateObject("Shell.Application")
Set FSO = CreateObject("Scripting.FileSystemObject")

'Set StartMenuFolder = ShellApp.NameSpace(CSIDL_COMMON_PROGRAMS)
Set Desktop =  ShellApp.NameSpace("C:\Users\Wayne\Desktop")

Dim LnkFile
LnkFile = Desktop.Self.Path&"\ScheduleNotifier.lnk"

If(FSO.FileExists(LnkFile)) Then
	Dim tmp, verb
	'For Each verb in Desktop.ParseName("ScheduleNotifier.lnk").Verbs
		'tmp = tmp&verb&chr(13)
	'Next
	'MsgBox(tmp)

	Dim desktopImtes, item
	Set desktopImtes = Desktop.Items()

	For Each item in desktopImtes
		If (item.Name = "ScheduleNotifier") Then
			'MsgBox(item.Name)
			For Each verb in item.Verbs
				If (verb.Name = "Pin to Tas&kbar") Then 'If (verb.Name = "锁定到任务栏(&K)")
					verb.DoIt
				End If
			Next
		End If
	Next

End If

Set FSO = Nothing
Set ShellApp = Nothing

Unpin from Taskbar

Option Explicit
'Const CSIDL_COMMON_PROGRAMS = &H17
Dim ShellApp, FSO, Desktop
Set ShellApp = CreateObject("Shell.Application")
Set FSO = CreateObject("Scripting.FileSystemObject")

'Set StartMenuFolder = ShellApp.NameSpace(CSIDL_COMMON_PROGRAMS)
Set Desktop =  ShellApp.NameSpace("C:\Users\Wayne\Desktop")

Dim LnkFile
LnkFile = Desktop.Self.Path&"\ScheduleNotifier.lnk"

If(FSO.FileExists(LnkFile)) Then
	Dim tmp, verb
	'For Each verb in Desktop.ParseName("ScheduleNotifier.lnk").Verbs
		'tmp = tmp&verb&chr(13)
	'Next
	'MsgBox(tmp)

	Dim desktopImtes, item
	Set desktopImtes = Desktop.Items()

	For Each item in desktopImtes
		If (item.Name = "ScheduleNotifier") Then
			'MsgBox(item.Name)
			For Each verb in item.Verbs
				If (verb.Name = "Unpin from Tas&kbar") Then 'If (verb.Name = "从任务栏脱离(&K)")
					verb.DoIt
				End If
			Next
		End If
	Next

End If

Set FSO = Nothing
Set ShellApp = Nothing

Although two snippets of VBS code are simple and stright-forward, they has on serious limitation, it only support one specified language, attention of this line of code:

If (verb.Name = "Pin to Tas&kbar") Then 'If (verb.Name = "锁定到任务栏(&K)")

On Chinese locale, I have to replace “Pin to Tas&kbar” with “锁定到任务栏(&K)”, so in order to support more languages I need to know each exact {Pin sentence} to do the pinning, you know, google translation won’t always work in this case:), so I definitely don’t want to do that…

 

You probably ask WHY??? Because FolderItemVerb object only has one property: Name, and Name is definitely “language sensitive“, MSDN does mention there are two more properties “Application” and “Parent” however they are “Not implemented”.

Several tips

  • For a specific Windows user, all shortcuts pinned onto taskbar store the shortcuts files under
    %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
  • OEM manufacturers could “pre-pin” some shortcut onto the Taskbar before shipping the PC/laptops to the consumers, simply run batch command below during the DASH (see Desktop and mobile Architecture for System Hardware) process:
    Rem Pining OEM Welcome Center app on task barReg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\TBDEn /v SBOEM0 /t REG_EXPAND_SZ /d “SomeFile.lnk” /f
  •  

    References

    Pin and Un-pin items to/from the Windows 7 taskbar
    http://blog.ananthonline.net/?p=37