将exe固定到Windows任务栏的替代方法?

时间:2014-10-09 02:00:37

标签: c# .net vb.net windows taskbar

我正在寻找一种方法来将exe和/或快捷方式固定到Windows 8.1任务栏(不在StartMenu中)而不依赖于动词名称。

我做了一项研究,我只能找到像this这样的代码示例,因为它们与动词名称语言有关,所以它无效,这意味着它会检查标题为“ Pin To Taskbar <的动词< / strong>“然后调用它,但该动词不存在其他语言的英文名称,例如西班牙语' Pin To Taskbar '被翻译为' Anclar a la barra de tareas ',我真的希望调用解析其动词名称的动词不是执行此任务的唯一方法。

然后我想知道微软的WindowsAPICodePack库是否可以提供一种以更有效的方式执行此操作的方法,或者至少以一种真正有用的方式。

或者可能使用Windows API SendMessage功能?

有什么想法吗?

3 个答案:

答案 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