与标题一样,是否有任何Win32 API可以做到这一点?
答案 0 :(得分:16)
不要这样做。
我99%确定没有正式的API,原因与没有programmatic access to the old Start Menu's pin list完全相同。
简而言之,大多数用户不希望程序在他们的收藏夹,快速启动,任务栏等中放入垃圾,因此Windows不支持您这样做。
答案 1 :(得分:7)
我正在尝试实现一个VirtuaWin (opensource virtual desktop software)插件,允许我将不同的按钮固定到不同的虚拟桌面。完全有效的理由使用它。
找到了固定它的方法:
以下代码段取自Chromium shortcut.cc file,几乎未更改,另请参阅ShellExecute
function at the MSDN
bool TaskbarPinShortcutLink(const wchar_t* shortcut) {
int result = reinterpret_cast<int>(ShellExecute(NULL, L"taskbarpin", shortcut,
NULL, NULL, 0));
return result > 32;
}
bool TaskbarUnpinShortcutLink(const wchar_t* shortcut) {
int result = reinterpret_cast<int>(ShellExecute(NULL, L"taskbarunpin",
shortcut, NULL, NULL, 0));
return result > 32;
}
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
如果您知道快捷方式,似乎非常简单。对我而言,虽然这还不够,但我还需要迭代现有的按钮,并在不同的桌面上取消固定并重新打印它们。
答案 2 :(得分:3)
您可以通过Windows Shell动词固定/取消固定应用程序:
http://blogs.technet.com/deploymentguys/archive/2009/04/08/pin-items-to-the-start-menu-or-windows-7-taskbar-via-script.aspx
对于API,有一个脚本友好的COM库,用于使用Shell:
http://msdn.microsoft.com/en-us/library/bb776890%28VS.85%29.aspx
以下是用JScript编写的示例:
// Warning: untested and probably needs correction
var appFolder = "FOLDER CONTAINING THE APP/SHORTCUT";
var appToPin = "FILENAME OF APP/SHORTCUT";
var shell = new ActiveXObject("Shell.Application");
var folder = shell.NameSpace(appFolder);
var folderItem = folder.ParseName(appToPin);
var itemVerbs = folderItem.Verbs;
for(var i = 0; i < itemVerbs.Count; i++)
{
// You have to find the verb by name,
// so if you want to support multiple cultures,
// you have to match against the verb text for each culture.
if(itemVerbs[i].name.Replace(/&/, "") == "Pin to Start Menu")
{
itemVerbs[i].DoIt();
}
}
答案 3 :(得分:2)
在Code Project article的评论中,它说你所要做的就是在文件夹“C:\ Users \ Username \ AppData \ Roaming \ Microsoft \ Internet Explorer \ Quick Launch \ User Pinned”中创建一个符号链接\任务”。
但它似乎通常是不合情理的做法,正如其他评论所指出的那样。
答案 4 :(得分:1)
我发现没有正式的API可以做到这一点,但有人通过VBScript做到了。 http://blog.ananthonline.net/?p=37 感谢。
答案 5 :(得分:1)
只是为了在信息上添加一些链接,因为微软现在提供关于“Taskbar Extensions”的官方文档:
固定了一小组应用程序 默认情况下,用于新安装。 除此之外,只有用户才可以 进一步应用;的编程 由应用程序固定不是 允许的。强>
所以 Kevin Montrose 答案是正确答案:不要。
答案 6 :(得分:1)
它有效,但不适用于所有操作系统,例如Windows 10:
[DllImport("kernel32.dll")]
private static extern IntPtr LoadLibrary(string dllName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax);
private static void PinUnpinTaskBar(string filePath, bool pin)
{
if (!File.Exists(filePath))
throw new FileNotFoundException(filePath + " not exists!");
int MAX_PATH = 255;
var actionIndex = pin ? 5386 : 5387; // 5386 is the DLL index for"Pin to Tas&kbar", ref. http://www.win7dll.info/shell32_dll.html
StringBuilder szPinToStartLocalized = new StringBuilder(MAX_PATH);
IntPtr hShell32 = LoadLibrary("Shell32.dll");
LoadString(hShell32, (uint)actionIndex, szPinToStartLocalized, MAX_PATH);
string localizedVerb = szPinToStartLocalized.ToString();
// create the shell application object
dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
string path = Path.GetDirectoryName(filePath);
string fileName = Path.GetFileName(filePath);
dynamic directory = shellApplication.NameSpace(path);
dynamic link = directory.ParseName(fileName);
dynamic verbs = link.Verbs();
for (int i = 0; i < verbs.Count(); i++)
{
dynamic verb = verbs.Item(i);
if ((pin && verb.Name.Equals(localizedVerb)) || (!pin && verb.Name.Contains(localizedVerb)))
{
verb.DoIt();
break;
}
}
}
答案 7 :(得分:0)
此文件夹包含固定应用程序的快捷方式
C:\ Users \ Your-User-Name \ AppData \ Roaming \ Microsoft \ Internet Explorer \ Quick Launch \ User Pinned \ TaskBar