[C# | Windows 10] Snelkoppeling vastpinnen aan taakbalk

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Achtergrond

In één van mijn applicaties (MicroSE JumpIt) gebruik ik een functie waarmee snelkoppelingen automatisch aan de taakbalk "vastgepind" kunnen worden. In deze applicatie kan je lijstjes "profielen" maken om snelkoppelingen aan de taakbalk te maken. (Ook wel JumpLists genomend). Via de applicatie kan je een profiel met een knopje op de taakbalk vastpinnen.

Hiervoor gebruik ik de volgende code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        public static void PinUnpinTaskBar(FileInfo fileInfo, bool pin)
        {
            if (!fileInfo.Exists) throw new FileNotFoundException(fileInfo.FullName);

            // create the shell application object
            var shellApplication = new ShellClass();

            string path = fileInfo.DirectoryName;
            string fileName = fileInfo.Name;

            Folder directory = shellApplication.NameSpace(path);
            FolderItem link = directory.ParseName(fileName);

            var verbs = link.Verbs().OfType<FolderItemVerb>();

            foreach (var v in verbs)
            {
                var n = v.Name.Replace(@"&", string.Empty).ToLower();

                if (pin && pinItems.Contains(n) || !pin && unpinItems.Contains(n))
                {
                    v.DoIt();
                }
            }

            shellApplication = null;
        }


Dit werkt perfect in Windows 7, 8, 8.1...

Het probleem

Het werkt niet in Windows 10. Op regel 20 hierboven wordt gecontroleerd op een shell item met de naam "Pin to taskbar" of "Unpin from taskbar" En in de verkenner wordt deze ook netjes getoond. Alleen de API geeft deze niet terug. Er is ook geen ander item in de lijst met vergelijkbare functionaliteit.

Dit zijn de Verbs die de Windows Shell teruggeeft:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
&Open
Open file locat&ion

Run as &administrator
Troubleshoot compatibilit&y
&Pin to Start
Restore previous &versions

Cu&t
&Copy
Create &shortcut
&Delete
Rena&me
P&roperties


Wel een Pin to Start, maar geen Pin to Taskbar.

Mijn vraag
Weet iemand een oplossing voor het probleem? Alles wat ik op google heb gevonden is de bovenstaande code. Maar dat werkt niet meer op Windows 10.

Acties:
  • 0 Henk 'm!

  • Laurens-R
  • Registratie: December 2002
  • Laatst online: 29-12-2024
Is er geen 'officiele' manier/API om dit te doen? Een context menu oid uitlezen klink wat hackey en het verbaasd me daarom ook niet dat dit 'ineens' breekt.

Ik heb even snel wat zitten googlen, en ik kom bar weinig tegen wat lijkt op een API. Daarentegen wil je ook niet dat malware oid ineens wat items toevoegd die de gebruiker fopt en waar deze vervolgens snel op klikt, dus ik kan me wel voortstellen waarom ze dat er evt. uitgesloopt hebben.

[ Voor 31% gewijzigd door Laurens-R op 17-08-2015 13:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Enige officiele wat ik van MS tegen ben gekomen wijst idd op "Niet doen".

MSDN: Taskbar Extensions (Windows)
only the user can pin further applications; programmatic pinning by an application is not permitted.
Dus het lijkt er idd op dat MS dit "lek" gedicht heeft.

Acties:
  • 0 Henk 'm!

  • Coca-Cola
  • Registratie: Maart 2001
  • Laatst online: 07:01
Er is geen API omdat Microsoft dit inderdaad niet wil al zijn ze zich bewust dat er altijd wel developers zullen zijn die iets in elkaar kunnen hacken wat dit doet:
http://blogs.msdn.com/b/o.../2014/12/30/10583474.aspx

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jup. Dat omschrijft daadwerkelijk mijn originele oplossing :)

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Verwijderd schreef op maandag 17 augustus 2015 @ 19:14:
Jup. Dat omschrijft daadwerkelijk mijn originele oplossing :)
Die originele oplossing ging sowieso ook al stuk op gelocaliseerde Windows omgevingen, waar het context menu sowieso nooit een actie genaamd "(un)pin from taskbar" bevat. Weinig aan verloren dus.

Moraal van het verhaal; hou je aan Microsoft's APIs en probeer niet de slimme jongen uit te hangen, want uiteindelijk zal dat je software nekken bij een security patch of OS upgrade. (Zie ook: al die brakke software die bij de overgang naar Vista 'ineens' stuk ging.)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
R4gnax schreef op maandag 17 augustus 2015 @ 20:18:
[...]


Die originele oplossing ging sowieso ook al stuk op gelocaliseerde Windows omgevingen, waar het context menu sowieso nooit een actie genaamd "(un)pin from taskbar" bevat. Weinig aan verloren dus.
Als je mn code leest zie je dat ik daar op voorbereid was. Maar verder heb je gelijk :)

iig ga ik een andere oplossing zoeken.. Een die wel overeenkomt met de MS-standaard.

[ Voor 9% gewijzigd door Verwijderd op 17-08-2015 20:59 ]


Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Btw:
code:
1
2
3
4
  if (pin && pinItems.Contains(n) || !pin && unpinItems.Contains(n))
                {
                    v.DoIt();
                }

- Gebruik haakjes om de subclausules, C# doet in dit geval de 1e en 2e evalueren en hierna (eventueel) de 3e en 4e, maar er zijn ook zat mogelijkheden waarin de 1e,2e en 3e geevalueerd worden en hierna het 4e operand pas waardoor je hele andere resultaten krijgt. Verder leest het lastiger.
- Gebruik logischere name voor functies ipv 'DoIt" ? (zeker als het object waarop je het aanroept een var is, moet je dus gaan terugzoeken naar de initialisatie om erachter te komen wat het nu precies is)

shellApplication = null; is niet nodig btw, zodra je de functie verlaat (regel erna) word de reference counter automatisch 1 lager en mag de GC zijn ding doen ermee.

Mess with the best, die like the rest


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
1. && gaat boven || dus zijn extra haakjes hier overbodig.
2. DoIt is de naam van de functie in de Shell32 API. De naam heb ik niet verzonnen ;)
Wat je nog kan betwisten is de naam van de variabel.
3. GC doet hier weinig mee, het is een unmanaged call.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
ThaStealth schreef op woensdag 19 augustus 2015 @ 10:41:
- Gebruik haakjes om de subclausules, C# doet in dit geval de 1e en 2e evalueren en hierna (eventueel) de 3e en 4e, maar er zijn ook zat mogelijkheden waarin de 1e,2e en 3e geevalueerd worden en hierna het 4e operand pas waardoor je hele andere resultaten krijgt.
De operator precedence is gewoon goed gedocumenteerd, en is de gebruikelijke definitie, ik zou zo snel ook geen taal kunnen noemen die dat heel anders gedefinieerd heeft ( PHP heeft wel de 'or' en 'and' operator die andere precedence hebben dan &&, &, || en | ) . Natuurlijk kan het in een andere taal anders zijn, maar dat is natuurlijk geen reden om haakjes toe te voegen. Qua leesbaarheid is er natuurlijk wel wat voor te zeggen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Woy schreef op woensdag 19 augustus 2015 @ 13:08:
[...]

De operator precedence is gewoon goed gedocumenteerd, en is de gebruikelijke definitie, ik zou zo snel ook geen taal kunnen noemen die dat heel anders gedefinieerd heeft ( PHP heeft wel de 'or' en 'and' operator die andere precedence hebben dan &&, &, || en | ) . Natuurlijk kan het in een andere taal anders zijn, maar dat is natuurlijk geen reden om haakjes toe te voegen. Qua leesbaarheid is er natuurlijk wel wat voor te zeggen.
Ikzelf weet ook geen modernere taal waar dit specifieke geval een probleem zou zijn.

Apl, Smalltalk, Lisp (true: niet echt de meest populaire talen tegenwoordig) handelen van links naar rechts af als je geen haakjes gebruikt,
En als je Pascal en C naast elkaar legt zul je zien dat dat & (pascal: and), | (pascal: or), + en - een andere volgorde heeft in beide talen

Wanneer je het je aanleert om te gebruiken kom je nooit in problemen ermee als er iemand ooit verzint dat het wel handig kan zijn.
Verwijderd schreef op woensdag 19 augustus 2015 @ 11:56:
2. DoIt is de naam van de functie in de Shell32 API. De naam heb ik niet verzonnen ;)
Wat je nog kan betwisten is de naam van de variabel.
Lol, dacht dat FolderItemVerb een van je eigen classes was, is gewoon een luie/inspiratieloze Microsoft developer geweest die hier aan het prutsen geweest is.

[ Voor 16% gewijzigd door ThaStealth op 19-08-2015 13:47 ]

Mess with the best, die like the rest


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Verwijderd schreef op woensdag 19 augustus 2015 @ 11:56:
3. GC doet hier weinig mee, het is een unmanaged call.
Heb je even goed uitgezocht of je dan toevallig niet een Dispose() aan kunt roepen om resources eerder te reclaimen?

Puur ervan uit gaan dat er wel een finalizer zal draaien die het boeltje voor je opruimt en de gekoppelde unmanaged resource naar behoren opruimt is namelijk niet erg verstanding. Er zijn legio manieren waarop het voor kan komen dat finalizers niet gaan draaien.

Lees o.a. eens http://ericlippert.com/20...u-know-is-wrong-part-one/

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
C#:
1
if (pin ? pinItems.Contains(n) : unpinItems.Contains(n))

Niet zelf de ?: operator uitvinden.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
R4gnax schreef op woensdag 19 augustus 2015 @ 21:47:
[...]


Heb je even goed uitgezocht of je dan toevallig niet een Dispose() aan kunt roepen om resources eerder te reclaimen?

Puur ervan uit gaan dat er wel een finalizer zal draaien die het boeltje voor je opruimt en de gekoppelde unmanaged resource naar behoren opruimt is namelijk niet erg verstanding. Er zijn legio manieren waarop het voor kan komen dat finalizers niet gaan draaien.

Lees o.a. eens http://ericlippert.com/20...u-know-is-wrong-part-one/
ShellClass is niet disposable, anders had ik echt wel netjes Dispose gebruikt ;)
MSalters schreef op donderdag 20 augustus 2015 @ 15:40:
C#:
1
if (pin ? pinItems.Contains(n) : unpinItems.Contains(n))

Niet zelf de ?: operator uitvinden.
Dat kan natuurlijk ook :) Maar is een (voor mij) minder gebruikelijke oplossing.

  • F.West98
  • Registratie: Juni 2009
  • Laatst online: 00:51

F.West98

Alweer 16 jaar hier

Doet Chrome niet ook zoiets als je een website wil pinnen?

2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI


Acties:
  • 0 Henk 'm!

  • Euwas
  • Registratie: Juli 2009
  • Laatst online: 14-09 10:38
F.West98 schreef op donderdag 20 augustus 2015 @ 16:14:
Doet Chrome niet ook zoiets als je een website wil pinnen?
Niet meer op windows 10. Als je een website pinned op de taskbar komt er een nieuwe shortcut in het start menu (waarbij hij wel als recently installed staat) in een chrome mapje. Pinnen moet je echt zelf doen. Best verwarrend dat chrome daar ook nog geen melding over geeft.

Acties:
  • 0 Henk 'm!

  • GranCanaria
  • Registratie: November 2006
  • Laatst online: 17-09 15:15
Ja is balen. Ik heb precies hetzelfde probleem en helaas wil Microsoft niet dat je automatisch dingen kunt pinnen in de user scope. Unpinnen gaat overigens wel.

Maar hernoem je applicatie eens naar explorer.exe en run hem dan nog eens ;)
Pagina: 1