Ich versuche, ein Programm mit dem folgenden Code an die Taskleiste in Windows 10 (RTM) anzuheften:
$Shell = new-object -com "Shell.Application"
$folder = $Shell.Namespace((Join-Path $env:SystemRoot System32\WindowsPowerShell\v1.0))
$item = $folder.Parsename('powershell_ise.exe')
$item.invokeverb('taskbarpin');
Dies funktionierte unter Windows 8.1, jedoch nicht mehr unter Windows 10.
Wenn ich $item.Verbs()
ausführe, erhalte ich diese:
Application Parent Name
----------- ------ ----
&Open
Run as &administrator
&Pin to Start
Restore previous &versions
Cu&t
&Copy
Create &shortcut
&Delete
Rena&me
P&roperties
Wie Sie sehen, gibt es kein Verb, um es in der Taskleiste zu fixieren. Wenn ich jedoch mit der rechten Maustaste auf diese bestimmte Datei klicke, ist die Option vorhanden:
Fragen:
Vermisse ich etwas?
Gibt es in Windows 10 eine neue Möglichkeit, ein Programm an die Taskleiste anzuheften?
Hier ist die auf PowerShell portierte vbscript-Lösung von Humberto:
Param($Target)
$KeyPath1 = "HKCU:\SOFTWARE\Classes"
$KeyPath2 = "*"
$KeyPath3 = "Shell"
$KeyPath4 = "{:}"
$ValueName = "ExplorerCommandHandler"
$ValueData = (Get-ItemProperty("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\" +
"Explorer\CommandStore\Shell\Windows.taskbarpin")).ExplorerCommandHandler
$Key2 = (Get-Item $KeyPath1).OpenSubKey($KeyPath2, $true)
$Key3 = $Key2.CreateSubKey($KeyPath3, $true)
$Key4 = $Key3.CreateSubKey($KeyPath4, $true)
$Key4.SetValue($ValueName, $ValueData)
$Shell = New-Object -ComObject "Shell.Application"
$Folder = $Shell.Namespace((Get-Item $Target).DirectoryName)
$Item = $Folder.ParseName((Get-Item $Target).Name)
$Item.InvokeVerb("{:}")
$Key3.DeleteSubKey($KeyPath4)
if ($Key3.SubKeyCount -eq 0 -and $Key3.ValueCount -eq 0) {
$Key2.DeleteSubKey($KeyPath3)
}
Sehr schön! Ich habe ein paar kleine Verbesserungen an diesem PowerShell-Beispiel vorgenommen, ich hoffe, es macht dir nichts aus :)
param (
[parameter(Mandatory=$True, HelpMessage="Target item to pin")]
[ValidateNotNullOrEmpty()]
[string] $Target
)
if (!(Test-Path $Target)) {
Write-Warning "You freaking dumbass!!! $Target does not exist"
break
}
$KeyPath1 = "HKCU:\SOFTWARE\Classes"
$KeyPath2 = "*"
$KeyPath3 = "Shell"
$KeyPath4 = "{:}"
$ValueName = "ExplorerCommandHandler"
$ValueData =
(Get-ItemProperty `
("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\" + `
"CommandStore\Shell\Windows.taskbarpin")
).ExplorerCommandHandler
$Key2 = (Get-Item $KeyPath1).OpenSubKey($KeyPath2, $true)
$Key3 = $Key2.CreateSubKey($KeyPath3, $true)
$Key4 = $Key3.CreateSubKey($KeyPath4, $true)
$Key4.SetValue($ValueName, $ValueData)
$Shell = New-Object -ComObject "Shell.Application"
$Folder = $Shell.Namespace((Get-Item $Target).DirectoryName)
$Item = $Folder.ParseName((Get-Item $Target).Name)
$Item.InvokeVerb("{:}")
$Key3.DeleteSubKey($KeyPath4)
if ($Key3.SubKeyCount -eq 0 -and $Key3.ValueCount -eq 0) {
$Key2.DeleteSubKey($KeyPath3)
}
Tut mir leid, etwas so Altes wiederzubeleben.
Ich weiß nicht, wie man das in Powershell macht, aber in VBScript kann man diese von mir entwickelte Methode machen. Es funktioniert unabhängig von der Systemsprache.
Funktioniert unter Windows 8.x und 10.
Skript
If WScript.Arguments.Count < 1 Then WScript.Quit
'----------------------------------------------------------------------
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFile = WScript.Arguments.Item(0)
sKey1 = "HKCU\Software\Classes\*\Shell\{:}\\"
sKey2 = Replace(sKey1, "\\", "\ExplorerCommandHandler")
'----------------------------------------------------------------------
With WScript.CreateObject("WScript.Shell")
KeyValue = .RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer" & _
"\CommandStore\Shell\Windows.taskbarpin\ExplorerCommandHandler")
.RegWrite sKey2, KeyValue, "REG_SZ"
With WScript.CreateObject("Shell.Application")
With .Namespace(objFSO.GetParentFolderName(objFile))
With .ParseName(objFSO.GetFileName(objFile))
.InvokeVerb("{:}")
End With
End With
End With
.Run("Reg.exe delete """ & Replace(sKey1, "\\", "") & """ /F"), 0, True
End With
'----------------------------------------------------------------------
Befehlszeile:
pin and unpin: taskbarpin.vbs [fullpath]
Example: taskbarpin.vbs "C:\Windows\notepad.exe"
In Windows 10 hat Microsoft eine einfache Prüfung hinzugefügt, bevor das Verb angezeigt wird. Der Name der ausführbaren Datei muss Explorer.exe sein. Es kann sich in jedem Ordner befinden, nur der Name wird geprüft. Der einfachste Weg in C # oder einem kompilierten Programm wäre also, Ihr Programm umzubenennen.
Wenn dies nicht möglich ist, können Sie das Shell-Objekt täuschen und glauben, Ihr Programm heißt Explorer.exe. Ich schrieb einen Beitrag hier darüber, wie dies in C # durch Ändern des Bildpfads in der PEB geschehen soll.
Ich habe das gleiche Problem und weiß immer noch nicht, wie ich damit umgehen soll, aber dieses kleine Kommandozeilen-Tool macht Folgendes:
http://www.technosys.net/products/utils/pintotaskbar
Sie können es folgendermaßen in der Befehlszeile verwenden:
syspin "path/file.exe" c:5386
ein Programm an die Taskleiste anheften und
syspin "path/file.exe" c:5387
um es zu lösen. Das funktioniert gut für mich.