Pin, unpin applications to taskbar with undocumented api

Post your working scripts, libraries and tools for AHK v1.1 and older
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Pin, unpin applications to taskbar with undocumented api

08 Oct 2023, 06:57

https://geelaw.blog/entries/msedge-pins
https://github.com/vhanla/W1nDro1d/blob/main/TaskbarPinner.pas

Code: Select all

msgbox % GetAllPinned()
pin("C:\Windows\System32\Notepad.exe")
msgbox pinned
unpin("C:\Windows\System32\Notepad.exe")
msgbox unpinned

pin(app)   ; https://geelaw.blog/entries/msedge-pins https://github.com/vhanla/W1nDro1d/blob/main/TaskbarPinner.pas
{
   static oIPinnedList3 := TaskbandPin_Init()
   static FOLDERID_System := SHGetKnownFolderPath("{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}")
   if A_Is64bitOS and (A_PtrSize = 4) and InStr(app, FOLDERID_System)
   {
      msgbox For applications in %FOLDERID_System% need to run script with ahk64.
      exitapp
   }
   pidl := DllCall("Shell32.dll\ILCreateFromPathW", "wstr", app, "ptr")
   if DllCall(NumGet(NumGet(oIPinnedList3+0)+9*A_PtrSize), "ptr", oIPinnedList3, "ptr", pidl)  ; IsPinned
      DllCall(NumGet(NumGet(oIPinnedList3+0)+16*A_PtrSize), "ptr", oIPinnedList3, "ptr", 0, "ptr", pidl, "int", PLMC_EXPLORER := 4)   ; modify
   DllCall("Shell32.dll\ILFree", "ptr", pidl)
}

unpin(app)
{
   static oIPinnedList3 := TaskbandPin_Init()
   static FOLDERID_System := SHGetKnownFolderPath("{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}")
   if A_Is64bitOS and (A_PtrSize = 4) and InStr(app, FOLDERID_System)
   {
      msgbox For applications in %FOLDERID_System% need to run script with ahk64.
      exitapp
   }
   pidl := DllCall("Shell32.dll\ILCreateFromPathW", "wstr", app, "ptr")
   if !DllCall(NumGet(NumGet(oIPinnedList3+0)+9*A_PtrSize), "ptr", oIPinnedList3, "ptr", pidl)  ; IsPinned
      DllCall(NumGet(NumGet(oIPinnedList3+0)+16*A_PtrSize), "ptr", oIPinnedList3, "ptr", pidl, "ptr", 0, "int", PLMC_EXPLORER := 4)   ; modify
   DllCall("Shell32.dll\ILFree", "ptr", pidl)
}

GetAllPinned()
{
   static oIPinnedList3 := TaskbandPin_Init()
   DllCall(NumGet(NumGet(oIPinnedList3+0)+3*A_PtrSize), "ptr", oIPinnedList3, "ptr*", IEnumFullIDList)  ; EnumObjects
   DllCall(NumGet(NumGet(IEnumFullIDList+0)+5*A_PtrSize), "ptr", IEnumFullIDList)   ; reset
   loop
   {
      if DllCall(NumGet(NumGet(IEnumFullIDList+0)+3*A_PtrSize), "ptr", IEnumFullIDList, "uint", 1, "ptr*", pidl, "uint*", null)   ; next
         break
      VarSetCapacity(FilePath, 512, 0)
      DllCall("Shell32.dll\SHGetPathFromIDListW", "ptr", pidl, "str", FilePath)
      FilePaths .= FilePath "`n"
      DllCall("Ole32.dll\CoTaskMemFree", "ptr", pidl)
   }
   return FilePaths
}

TaskbandPin_Init()
{
   static oIPinnedList3
   if !oIPinnedList3
      oIPinnedList3 := ComObjCreate(CLSID_TaskbandPin := "{90AA3A4E-1CBA-4233-B8BB-535773D48449}", IPinnedList3 := "{0DD79AE2-D156-45D4-9EEB-3B549769E940}")
   return oIPinnedList3
}

SHGetKnownFolderPath(FOLDERID, KF_FLAG:=0) {                  ;   By SKAN on D356 @ tiny.cc/t-75602 
Local CLSID, pPath:=""                                        ; Thanks teadrinker @ tiny.cc/p286094
Return Format("{4:}", VarSetCapacity(CLSID, 16, 0)
     , DllCall("ole32\CLSIDFromString", "Str",FOLDERID, "Ptr",&CLSID)
     , DllCall("shell32\SHGetKnownFolderPath", "Ptr",&CLSID, "UInt",KF_FLAG, "Ptr",0, "PtrP",pPath)
     , StrGet(pPath, "utf-16")
     , DllCall("ole32\CoTaskMemFree", "Ptr",pPath))
}

Return to “Scripts and Functions (v1)”

Who is online

Users browsing this forum: jsong55 and 130 guests