2008-09-25 9 views
23

Plusieurs années en arrière, j'ai essayé innocemment d'écrire une petite application pour sauver mes icônes de bureau placées tactiquement parce que j'en avais marre de les ramener à leurs emplacements lorsqu'un événement les réinitialisait. J'ai abandonné après avoir perdu trop de temps à ne pas trouver un moyen d'interroger, encore moins sauvegarder et réinitialiser, la position de bureau de mes icônes.Comment puis-je manipuler par programmation les emplacements des icônes du bureau Windows?

Quelqu'un sait où Windows persiste cette information et s'il y a une API pour les définir?

Merci, Richard

Répondre

10

Si je ne me trompe pas le bureau est juste un ListView, et vous devrez envoyer le message LVM_SETITEMPOSITION à la poignée du bureau.

J'ai recherché un peu de code C# et je n'ai pas trouvé d'exemple, mais j'ai trouvé l'article suivant. Torry: ...get/set the positions of desktop icons?. C'est du code delphi, mais je le trouve très lisible et avec quelques P/Invokes vous pourrez le traduire en C#.

+0

J'ai commencé à utiliser ce code comme base, mais en cherchant quelque chose, j'ai trouvé le lien que j'ai posté comme réponse, donc je vous créditerai de la réponse, merci. – ZeroBugBounce

+0

Ce lien ressemble à de la poubelle en ce moment ... –

0

Je ne sais pas sur l'API, mais je sais ultramon (http://www.realtimesoft.com/ultramon/) a une fonctionnalité incluse pour préserver le placement des icônes (bien que je ne l'ai jamais utilisé pour préserver l'emplacement de l'icône, il est indispensable pour l'utilisation de plusieurs moniteurs). La dernière version bêta fonctionne parfaitement avec Vista (à l'exception d'avoir parfois un problème mineur ou deux lors de la première connexion à mon ordinateur via RDP), et bien sûr, n'ont eu aucun problème avec XP. Je l'ai utilisé pendant plus de quatre ans maintenant.

Et ai-je mentionné que c'est le meilleur utilitaire pour l'utilisation de plusieurs moniteurs?

2

Le bureau est simplement un contrôle ListView et vous pouvez obtenir son handle et lui envoyer des messages pour déplacer des icônes en utilisant LVM_SETITEMPOSITION.

Obtenir des positions d'icône en utilisant LVMGETITEMPOS est un peu plus compliqué, cependant. Vous devez passer un pointeur sur une structure POINT comme votre LPARAM. Si vous essayez de le faire, vous allez probablement planter Explorer. Le problème est que vous lui avez passé un pointeur dans votre espace d'adressage, que le contrôle a interprété comme un pointeur dans l'espace adresse de l'explorateur. Aie!

La solution que j'ai utilisée est d'injecter une DLL dans le processus Explorer et envoyer le message à partir de là. Ensuite, vous avez juste besoin d'un moyen de récupérer les informations de position à votre processus.

+2

Notez que vous n'avez pas besoin d'injecter une DLL: vous pouvez envoyer le message depuis proc, et utiliser VirtualAllocEx et Read/WriteProcessMemory pour configurer la mémoire dans l'espace de processus de l'explorateur, de sorte que vous ayez un pointeur LPARAM valide (du point de vue de l'explorateur) à utiliser. De cette façon, vous évitez d'avoir à communiquer de nouveau avec votre propre processus ou de traiter avec une DLL distincte. – BrendanMcK

Questions connexes