我正在寻找一种方法来将exe和/或快捷方式固定到Windows 8.1任务栏(不在StartMenu中)而不依赖于动词名称。
我做了一项研究,我只能找到像this这样的代码示例,因为它们与动词名称语言有关,所以它无效,这意味着它会检查标题为“ Pin To Taskbar <的动词< / strong>“然后调用它,但该动词不存在其他语言的英文名称,例如西班牙语' Pin To Taskbar '被翻译为' Anclar a la barra de tareas ',我真的希望调用解析其动词名称的动词不是执行此任务的唯一方法。
然后我想知道微软的WindowsAPICodePack
库是否可以提供一种以更有效的方式执行此操作的方法,或者至少以一种真正有用的方式。
或者可能使用Windows API SendMessage
功能?
有什么想法吗?
答案 0 :(得分:2)
Why is there no programmatic access to the Start menu pin list?
在Windows XP中,我们故意不以编程方式访问 “开始”菜单顶部的粗体列表项目(&#34;图钉列表&#34;)。该 pin列表是供用户放置自己喜欢的图标。它不是那个地方 一个程序单方面决定,&#34;我很酷。我是你的 最喜欢的图标我才知道。所以我会把自己放在那里,因为,好吧, 我很酷。&#34;
因为我们知道那一刻我们让人们弄乱了针脚列表, 每个人都会自己安装进去,它会成为 没有意义(而且很讨厌)。
作为他们的一部分,这些节目特别令人痛苦 安装,决定他们是如此酷,他们希望无处不在 确保你不会错过有史以来最酷最令人惊叹的节目 写在人类历史上,所以他们进入开始菜单, 进入快速项目,进入桌面,进入快速启动,进入 您的收藏夹,接管作为您的默认自动播放处理程序,甚至 作为任务栏上时钟旁边的图标,以防万一你 不知何故错过了所有其他地方 - 每次你运行它们, 他们会重新创建这些图标和设置,以防万一 &#34;意外丢失了他们&#34;。
我讨厌那些节目。
在Win7及更高版本上使用Microsoft-Windows-Shell-Setup看起来是可行的:TaskbarLinks
关于动词是否特定于语言,你确实是正确的,这里是说明这个Pin Items to the Start Menu or Windows 7 Taskbar via Script的文档:
必须在脚本中更改每个操作的动词,以便与其他语言一起使用。
对于自动部署,还可以配置其中一些项目 通过Windows Vista及更高版本的答案文件。 Windows 7的 提供unattend.xml设置以配置最多三个任务栏 固定项目(请参阅Microsoft中的Microsoft-Windows-Shell-Setup中的任务栏链接 自动安装工具包文档)。而Windows Vista和 Windows 7提供unattend.xml设置以配置最多五个 “开始菜单”中的“最近打开的程序”(StartPanelLinks in Microsoft的Windows的外壳程序设置)。但是,都没有提供方法 unattend.xml将项目固定到“开始”菜单。
答案 1 :(得分:0)
在您链接到的代码示例中,可以查看&amp; k的动词名称,这是固定到任务栏的键盘快捷键。对于不同的语言,这不会改变(我相信)。
所以在代码示例中更改它:
If (verb.Name = "Pin to Tas&kbar") _
到此:
If (InStr(verb.name,"&k")>0) _
或类似的东西。
答案 2 :(得分:0)
据我所知,没有正式的方法可以将应用程序固定到任务栏(此时),所以我认为你需要依赖那种带有动词的hacky方式。但你不需要(不应该)对它们进行硬编码;它们可以从shell32.dll库资源字符串表中读取。前段时间我为Inno Setup写了a script
,它可以固定app。通过使用这些动词到任务栏(基于this thread
)。该代码的一部分是从shell32.dll库中读取必要的动词,这就是我试图转换为VB的东西(这是我第一次使用VB.NET,所以请将以下代码作为概念的证明):
Module Module1
Const SHELL32_STRING_ID_PIN_TO_TASKBAR As Int32 = 5386
Const SHELL32_STRING_ID_UNPIN_FROM_TASKBAR As Int32 = 5387
Private Declare Auto Function LoadLibrary Lib "kernel32.dll" ( _
ByVal lpLibFileName As String _
) As IntPtr
Private Declare Function FreeLibrary Lib "kernel32.dll" ( _
ByVal hLibModule As IntPtr _
) As Boolean
Private Declare Auto Function LoadString Lib "user32.dll" ( _
ByVal hInstance As IntPtr, _
ByVal uID As Int32, _
ByVal lpBuffer As String, _
ByVal nBufferMax As Int32 _
) As Int32
Public Function TryGetVerbName(ByVal ID As Int32, ByRef VerbName As String) As Boolean
Dim Handle As IntPtr
Dim BufLen As Int32
Dim Buffer As String = Space(255)
Handle = LoadLibrary("shell32.dll")
If Not Handle.Equals(IntPtr.Zero) Then
Try
BufLen = LoadString(Handle, ID, Buffer, Buffer.Length)
If BufLen <> 0 Then
VerbName = String.Copy(Buffer)
Return True
End If
Finally
FreeLibrary(Handle)
End Try
End If
Return False
End Function
Sub Main()
Dim VerbName As String = String.Empty
If TryGetVerbName(SHELL32_STRING_ID_PIN_TO_TASKBAR, VerbName) Then
Console.WriteLine("Verb name for pin to taskbar: " + VerbName)
End If
If TryGetVerbName(SHELL32_STRING_ID_UNPIN_FROM_TASKBAR, VerbName) Then
Console.WriteLine("Verb name for unpin from taskbar: " + VerbName)
End If
Console.ReadLine()
End Sub
End Module