Win7 将程序在任务栏固定或取消固定(Au3)

Vista 以后微软在任务栏加入了新的快速启动功能(可能叫快速启动已经不合适了),程序需要人为的去手动点击固定到任务栏或从任务栏取消固定,且微软没有提供任何接口让用户在后台静默设定默认的快速启动程序,这也是为了保护任务栏的生态,不被一些恶意软件强制修改。但如果你必须要通过静默的方式实现这个功能怎么办?别着急,使用以下脚本即可解决你的问题。

#Region ;**** 参数创建于 ACNWrapper_GUI ****
#PRE_UseX64=n
#PRE_Res_requestedExecutionLevel=None
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <WinAPI.au3>
#include <Constants.au3>

_PinTaskbar(@WindowsDir & '\notepad.exe')

Func _PinTaskbar($File, $Pin = True)
    If @OSBuild < 7600  Then Return SetError(1) ; Windows 7 only
    If Not FileExists($File) Then Return SetError(2)

    local $sFolder              = StringRegExpReplace($File, "(^.*\\)(.*)", "\1")
    local $sFile                = StringRegExpReplace($File, "^.*\\", "")

    local $oShell               = ObjCreate("Shell.Application")
    local $oFolder              = $oShell.NameSpace($sFolder)
    local $oFolderItem          = $oFolder.ParseName($sFile)
    local $oFolderItemVerbs     = $oFolderItem.Verbs
    local $hInstance            = _WinAPI_LoadLibraryEx("shell32.dll", $LOAD_LIBRARY_AS_DATAFILE)
    local $DoVerb               = ''

    If $hInstance Then
        IF $Pin = 1 Then
            local $DoVerb = _WinAPI_LoadString($hInstance, 5386)
        Else
            local $DoVerb = _WinAPI_LoadString($hInstance, 5387)
        EndIf
        _WinAPI_FreeLibrary($hInstance)
    EndIf

    IF $DoVerb = '' Then Return SetError(3) ; $DoVerb string couldn't received

    For $i = 0 To $oFolderItemVerbs.Count - 1
        If $oFolderItemVerbs.Item($i).Name = $DoVerb Then
            $oFolderItemVerbs.Item($i).DoIt
            Return
        EndIf
    Next
    Return SetError(4) ; $DoVerb string not in menu

EndFunc

程序借助 Shell 模拟实现了用户的操作,但用户无任何感知,相当于静默实现的。_PinTaskbar 函数第一个参数是你要固定或取消固定的程序,第二个参数是一个带有默认值的参数,为 True 是固定到任务栏,为 False 是从任务栏取消固定。要注意的是,此功能在 Win10 上并不生效。

说说你的想法