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

    About Wayne Ye
    Wayne is a software developer, Tech Lead and also a geek, he has more than 6 years experience in developing Web/Windows based applications using ASP.NET, HTML/CSS, JavaScript/AJAX, Web Service, Silverlight, Winform, WPF, Win32 API/WMI, he also invests tremendous effect in GOF Design Patterns, S.O.L.i.D principle, MVC, MVVM, Domain Driven Design, SOA, HTTP/REST and AOP. In his spare time, he likes writing tech/life blogs on WayneYe.com, and separate time with his dear wife and lovely son. Wayne's Geek Life http://WayneYe.com Infinite passion on programming.

    6 Responses to Programmatically PIN shortcut onto Taskbar on Win7

    1. I’m using a big part of your script to solve the pin/unpin problems in one of my applications. For your further development: The German verbs are “An Tas&kleiste anheften” (pin) and “Von Tas&kleiste lösen” (unpin)

      Best regards,

      Monty.

    2. What’s up, yup this paragraph is truly fastidious and I have learned lot of things from it concerning blogging. thanks.

    3. Paul Fancher says:

      Excellent resource, I also built off of your script to solve the pin/unpin problems. Your solution is the only one I found that pins to a taskbar without erasing other pins already present.

      Best regards,
      Paul

    4. WOW just what I was looking for. Came here by searching for Whole Life Insurance

    5. tori black says:

      I can relate to some bunch of this. I have a strong stomach but this go around my tiny a single is determined to make me throw up
      cinnamon rolls. I’m going in for my three hour glucose check tomorrow because the one particular hour arrived again high for pregnancy. Diabetic issues runs in my family but I have usually been hypoglycemic. I’m sure they are tests me
      way also early on glucose but w/e! I will do what ever I’ve to for my Christmas bundle even though that means each my arms are bruised!

    Leave a comment