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

C# 将exe固定到Windows任务栏的替代方法?,c#,.net,vb.net,windows,taskbar,C#,.net,Vb.net,Windows,Taskbar,我正在寻找一种方法,在不依赖动词名称的情况下,将exe和/或快捷方式固定到Windows 8.1任务栏(不在StartMenu中) 我做了一项研究,我只发现这样的代码示例不起作用,因为它们依赖于动词名称语言,这意味着它会检查标题为“锁定到任务栏”的动词,然后调用它,但在其他语言中,该动词与英语名称不存在,例如,在西班牙语中,“固定到任务栏”被翻译为“Anclar a la barra de tareas”,我真的希望调用动词解析其动词名称不是执行此任务的唯一方式 然后我想知道微软的Windows

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

我做了一项研究,我只发现这样的代码示例不起作用,因为它们依赖于动词名称语言,这意味着它会检查标题为“锁定到任务栏”的动词,然后调用它,但在其他语言中,该动词与英语名称不存在,例如,在西班牙语中,“固定到任务栏”被翻译为“Anclar a la barra de tareas”,我真的希望调用动词解析其动词名称不是执行此任务的唯一方式

然后我想知道微软的
WindowsAPICodePack
库是否提供了一种更有效的方法,或者至少是一种真正可行的方法

或者使用Windows API
SendMessage
函数


有什么想法吗?

在链接到的代码示例中,您可以查找动词名称for&k,这是固定到任务栏的键盘快捷键。对于不同的语言,这一点不会改变(我相信)

因此,在代码示例中更改此选项:

If (verb.Name = "Pin to Tas&kbar") _
为此:

If (InStr(verb.name,"&k")>0) _
或者类似的东西。

在Windows XP中,我们故意不授予对 开始菜单顶部的粗体项目列表(“pin列表”)。这个 pin列表供用户放置他们喜爱的图标。不是这个地方 对于一个单方面决定的项目,“我很酷,我是你的 我最喜欢的图标。我只是知道。所以我会把自己放在那里,因为, 我太酷了。”

因为我们知道当我们让别人乱弄pin名单的时候, 每个人都会将自己安装到它中,它将成为 毫无意义(而且烦人)

特别让人恼火的是,作为他们工作的一部分 安装,决定他们是如此的酷,他们想无处不在 确保你不会错过有史以来最酷最精彩的节目 写在人类历史上,所以他们进入开始菜单, 进入快速项目,进入桌面,进入快速启动,进入 您的收藏夹,作为默认的自动播放处理程序,甚至 在任务栏上的时钟旁边挂上图标,以防万一 不知何故错过了所有其他地方-每次你经营它们, 他们去重新创建那些图标和设置,以防你 “不小心把它们弄丢了”

我讨厌那些节目


看起来在Win7及更高版本上安装Microsoft Windows Shell是可能的:

您确实正确地认为动词是特定于语言的,以下是说明这一点的文档:

脚本中每个动作的动词必须更改,以便与其他语言一起使用。

对于自动化部署,还可以配置其中一些项 通过Windows Vista及更高版本上的应答文件。视窗7 提供unattend.xml设置以配置最多三个任务栏 固定项目(请参见中Microsoft Windows Shell安装程序中的TaskbarLinks) 自动安装工具包文档)。Windows Vista和 Windows 7提供了unattend.xml设置,最多可配置五个 “开始”菜单上的“最近打开的程序”(中的StartPanelinks) Microsoft Windows Shell安装程序)。然而,这两种方法都没有提供一种解决方案 unattend.xml将项目固定到“开始”菜单


据我所知,目前还没有将应用程序固定到任务栏的正式方法,所以我认为您需要依靠动词的这种黑客方法。但是您不需要(不应该)硬编码它们;它们可以从shell32.dll库资源字符串表中读取。不久前,我为Inno安装程序写了一篇文章,它可以锁定应用程序。通过使用这些动词(基于)来设置任务栏。代码的一部分是从shell32.dll库中读取必要的动词,这就是我试图翻译到VB的内容(这是我第一次使用VB.NET,因此将以下代码作为概念证明):

模块1
常量SHELL32\u字符串\u ID\u引脚\u到任务栏,如Int32=5386
常量SHELL32\u字符串\u ID\u以Int32=5387的形式从任务栏取消固定
私有声明自动函数加载库库“kernel32.dll”(_
ByVal lpLibFileName作为字符串_
)As IntPtr
私有声明函数FreeLibrary Lib“kernel32.dll”(_
ByVal hLibModule As IntPtr_
)作为布尔值
私有声明自动函数LoadString Lib“user32.dll”(_
ByVal hInstance作为IntPtr_
ByVal uID作为Int32_
ByVal lpBuffer作为字符串_
ByVal nBufferMax As Int32_
)As Int32
作为布尔值的公共函数TryGetVerbName(ByVal ID为Int32,ByRef VerbName为String)
调暗手柄为IntPtr
Dim BufLen As Int32
作为字符串的Dim缓冲区=空格(255)
Handle=LoadLibrary(“shell32.dll”)
如果不是Handle.Equals(IntPtr.Zero),则
尝试
BufLen=LoadString(句柄、ID、缓冲区、缓冲区.Length)
如果BufLen为0,则
VerbName=String.Copy(缓冲区)
返回真值
如果结束
最后
自由库(句柄)
结束尝试
如果结束
返回错误
端函数
副标题()
Dim VerbName As String=String.Empty
如果TryGetVerbName(SHELL32\u STRING\u ID\u PIN\u TO\u TASKBAR,VerbName),则
Console.WriteLine(“绑定到任务栏的动词名称:”+VerbName)
如果结束
如果TryGetVerbName(SHELL32\u字符串\u ID\u从\u任务栏取消固定,VerbName),则
Console.WriteLine(“从任务栏取消绑定的动词名称:”+VerbName)
如果结束
Console.ReadLine()
端接头
端模块

请记住,应用程序不应该这样做。如果用户自己不这么做,你就不能决定是否真的应该锁定你的应用程序。@Harry Johnston感谢你的建议,但是
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