8
votes

Windows 7 - Barre de tâches - Pin ou impuissance des liens de programme

Comme dans le titre, y a-t-il une API Win32 pour faire cela?


7 commentaires

N'EST-IL N'EST-IL N'EST-IL N'EST-IL N'EST-IL N'EST-IL N'EST-ILS Pourquoi un programme devrait-il le faire pour eux?


Mon client a besoin de notre programme d'installation pour épingler / impulser l'application sur la barre des tâches par défaut. Merci.


Je crois que cette fonctionnalité, comme la broche pour démarrer le menu dans XP / Vista, est délibérément non exposée précisément pour que les programmes ne puissent pas remplacer la décision de l'utilisateur sur le fait de savoir si un programme mérite de précieux espace de la barre des tâches. Sinon, chaque programme spammy se considérerait si Gosh-a-t-il été important de pouvoir s'imprégner de la barre des tâches, quel que soit le consentement de l'utilisateur. Voir Nombreux articles de Raymond Chen Passim.


Si vous avez un client spécifique qui souhaite épingler / impublir votre application sur les sauts de tâches d'utilisateurs, je rechercherais un paramètre de stratégie de groupe plutôt que d'une API. (La décision de conception étant «qui faisons-nous confiance pour décider si le programme X passe dans la barre des tâches: le programme Sysadmin ou le programme X?») Je ne sais pas s'il existe un tel paramètre, mais vous pouvez essayer de demander à ServerFault.com.


@Yigang Wu: Votre client est-il le gouvernement? Sinon, j'espère qu'ils ont une très bonne raison de remplacer les préférences de l'utilisateur.


Je comprends les dangers d'avoir une telle API, mais il serait utile de créer un programme qui change la barre des tâches entre des contextes créés par l'utilisateur tel que "Développement", "Personnel" et "Gaming". En fonction de la raison pour laquelle j'utilise mon ordinateur, je veux un ensemble différent d'applications visibles sur la barre des tâches.


Il est typique que les gens répondent ici à ce qu'ils croient s'ils ne savent pas (comme Itwlson), puis d'autres personnes qui ne savent pas non plus voter ce mauvais commentaire. La bonne réponse a été donnée ci-dessous par Ciantic. "La décision de l'utilisateur ..." C'est un non-sens. Si j'écris un programme d'installation qui demande à mon utilisateur s'il veut un raccourci dans la barre des tâches, il s'agit de la décision de l'utilisateur que mon installateur écrit un lien vers la barre des tâches. Pourquoi Miscrosoft devrait-il interdire cela? Il existe de nombreux utilisateurs sans ordinateur Kowledge qui ne trouvent pas de programme s'il n'est pas dans la barre des tâches, même depuis Windows 8 où le StartMenu est une mauvaise blague.


8 Réponses :


0
votes

Ce dossier contient un raccourci d'application épinglée

C: \ users \ User \ Your-Name-nom \ AppData \ Roaming \ Microsoft \ Internet Explorer \ Lancement rapide \ User Pinned \ Barre de tâches


3 commentaires

Ummm ... Je viens d'essayer d'épingler un élément dans la barre des tâches et ce dossier n'a pas été créé. Êtes-vous sûr de fonctionner pour Windows 7?


@Larry Ce dossier ne fonctionne que pour détecter si un programme est épinglé ou non. Ajout de nouveaux raccourcis à celui-ci n'apportera pas d'éléments épinglés à la barre des tâches.


Si vous auriez jamais essayé de copier un raccourci vers ce dossier, vous auriez vu qu'il n'apparaît pas dans la barre des tâches. L'existence pure du fichier n'est pas suffisante. Voir la bonne réponse de Ciantic.



16
votes

Ne faites pas cela.

J'ai 99% sûr qu'il n'y a pas d'API officielle pour cela, car exactement la même raison qu'il n'y avait pas Accès programmatique à la liste des broches du menu Old Démarrage .

En bref, la plupart des utilisateurs ne veulent pas que des programmes mettent des junk in leurs favoris Favoris, un lancement rapide, une barre des tâches, etc. afin que les fenêtres ne vous soutiennent pas en tant que telle.


5 commentaires

La réponse de Kevin est la bonne :). Il suffit de résister à la pression de votre client.


Wow ... quand Larry Osterman est d'accord avec une réponse, c'est probablement le bon :)


Il y a des raisons valables, par exemple J'utilise plusieurs ordinateurs de bureau (OpenSource) Virtuawin et je souhaite annuler différents programmes sur différents bureaux. J'ai besoin de trouver des API pour cela pour la mettre en œuvre.


Kevin, tu es 99% mal! Il est typique que les gens répondent ici ce qu'ils croient s'ils ne savent pas et que d'autres personnes qui ne savent pas non plus voter cette mauvaise réponse. Le code posté par Ciantic montre que vous avez tort. "Les utilisateurs ne veulent pas ..." C'est un non-sens. Si j'écris un programme d'installation qui demande à mon utilisateur s'il veut un raccourci dans la barre des tâches, il s'agit de la décision de l'utilisateur que mon installateur écrit un lien vers la barre des tâches. Pourquoi Miscrosoft devrait-il interdire cela? Il y a beaucoup d'utilisateurs sans ordinateur Kowledge qui ne trouvent pas de programme si ce n'est pas dans la barre des tâches, même depuis Windows 8 où le StartMenu est une mauvaise blague.


De plus, une vue de programmeurs n'est pas la seule à prendre en compte. En tant que Sysadmin, il est super gênant de ne pas avoir le contrôle de ce seul point dans le système. Et s'il vous plaît arrêter les "utilisateurs ne veulent pas" arguments ... un administrateur (et la plupart des programmeurs également) a le droit de paralyser complètement l'utilisateur dans 99 aspects sur 100 de Windows. Pour ne pas donner ce pouvoir dans ce dernier est tout simplement paresseux de Microsoft. Personne ne profite de cela. Et hé, regardez Windows 10, qui est livré avec des applications de MS préparées étonnantes ... Où est le choix de l'utilisateur maintenant?



1
votes

J'ai trouvé qu'il n'y a pas d'API officielle pour faire cela, mais quelqu'un l'a fait via VBScript. http://blog.ananthonline.net/?p=37 Merci.


0 commentaires

2
votes

dans les commentaires d'un Article de projet Dit que tout ce que vous avez à faire est de créer un lien symbolique dans le dossier "C: \ utilisateurs \ nom_servateur \ appdata \ itinérance \ Microsoft \ Internet Explorer \ Lancement rapide \ User Pinned \ Barre de tâches".

Mais il semble généralement être une pratique insociable, car les autres commentaires ont noté ici.


1 commentaires

Incidemment, les versions récentes de Chrome semblent le faire à la fois lorsque vous l'installez et la première fois qu'elle lance.



2
votes

Vous pouvez épingler / impulser les applications via Windows Shell Verbes:
http://blogs.technet.com/deploymentguys/archive/2009/04/08/pin-items-a-the-start-menu-or-windows-7-taskbar-via- script.aspx

Pour API, il y a une bibliothèque conviviale de script pour travailler avec la coquille:
http://msdn.microsoft.com/fr- US / Bibliothèque / BB776890% 28V.85% 29.aspx P>

Voici un exemple écrit dans JScript: P>

// 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();
    }
}


0 commentaires

2
votes

Juste pour mettre des liens sur les informations que Microsoft propose désormais une documentation officielle sur " Extensions de la barre des tâches ":

Un petit ensemble d'applications est épinglé Par défaut pour de nouvelles installations. Autres que ceux-ci, seul l'utilisateur peut épingler d'autres applications; programmatique épingler par une application n'est pas autorisé.

SO Kevin Montrose La réponse est la bonne: non.


1 commentaires

La réponse de Kevin est définitivement fausse. Voyez mon commentaire là-bas.



7
votes

J'essaie de mettre en œuvre un Virtuawin (logiciel de bureau virtuel opensource) plug-in qui me permet de broder des boutons différents de différents bureaux virtuels. Raison complètement valide de l'utiliser.

a trouvé la voie à la broyer / l'impulser déjà: p>

Le code suivant est extrait de Chrome ShorCutCut.CC Fichier , presque inchangé, voir aussi le Shellexecute code> Fonction sur le MSDN P>

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.


5 commentaires

SUPER! Cela fonctionne parfaitement. Il semble être une caractéristique non documentée. Le MSDN ne nous dit pas sur l'opération "Taskbarpin". Vous avez oublié de mentionner que le "raccourci" dans votre code doit être le chemin d'accès à un raccourci déjà existant n'importe où sur le disque. Shellexecute ne crée pas de nouveau raccourci. Il suffit de copie un raccourci existant sur le dossier "% Appdata% \ Microsoft \ Internet Explorer \ Lancement rapide \ USER \ Barre de tâches" et rend le raccourci visible dans la barre des tâches. Important: Si vous ne copiez qu'un raccourci sur ce dossier, il n'apparaîtra pas dans la barre des tâches.


Notez que Shellexecute ("Taskbarpin") renvoie une erreur 31 si l'icône est déjà affichée dans la barre des tâches. Dans ce cas, la fonction ne copie pas le fichier LNK dans le dossier "... Barre de tâches de l'utilisateur".


Un autre point important est que Shellexecute ("Taskbarunpin") échoue avec une erreur 5 si le fichier sur lequel le raccourci est pointé n'existe pas. (Cela semble être un bug.) Cela signifie: Si vous voyez un raccourci dans la barre des tâches et que le fichier LNK correspondant existe, mais la destination de la LNK n'existe pas, il devient alors impossible de supprimer le raccourci de la barre des tâches. Donc, si vous écrivez un programme de désinstallation, vous devez d'abord impublir votre candidature, puis supprimer la demande elle-même.


Cela fonctionne, mais sachez que Microsoft supprima la prise en charge de Windows 10. et il n'y avait pas de fonctionnalité de «broche à la barre des tâches» avant 7. Par conséquent, cela ne fonctionne que sur 7 et 8, que j'ai confirmé en testant directement.


Ceci est en outre confirmé dans un Commentaire du code du chrome : " PIN de la barre des tâches "a cessé d'être pris en charge sous Windows 10.



2
votes

Cela fonctionne, mais pas pour tous les systèmes d'exploitation, par ex. 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;
            }
        }
    }


0 commentaires