2008-09-25 14 views
23

Hace varios años, inocentemente traté de escribir una pequeña aplicación para guardar mis íconos de escritorio colocados tácticamente porque estaba cansada de arrastrarlos a sus ubicaciones cuando algún evento los reiniciaba. Me di por vencido después de enterrar WAY demasiado tiempo al no haber encontrado una forma de consultar, y mucho menos guardar y restablecer, la posición de escritorio de mis iconos.¿Cómo puedo manipular mediante programación las ubicaciones de iconos de escritorio de Windows?

¿Alguien sabe dónde persiste Windows esta información y si hay una API para configurarlos?

Gracias, Richard

Respuesta

10

Si no me equivoco, el escritorio es solo un ListView, y deberá enviar el mensaje LVM_SETITEMPOSITION al identificador del escritorio.

Busqué en Google un poco de código C# y no pude encontrar un ejemplo, pero encontré el siguiente artículo. Torry: ...get/set the positions of desktop icons?. Es un código Delphi, pero me parece muy legible y con algunos P/Invocaciones podrás traducirlo a C#.

+0

Empecé a usar ese código como base, pero luego, mientras busqué en Google algo de él, encontré el enlace que publiqué como respuesta, así que le daré un crédito con la respuesta, gracias. – ZeroBugBounce

+0

Ese enlace parece basura ahora ... –

0

que no tienen ni idea acerca de la API, pero sé UltraMon (http://www.realtimesoft.com/ultramon/) ha incluido una característica para preservar icono de colocación (aunque nunca he utilizado para preservar icono de ubicación, es indispensable para el uso de monitores múltiples). La última versión beta funciona sin problemas con Vista (excepto por tener a veces un fallo menor o dos al iniciar sesión inicialmente en mi máquina a través de RDP), y por supuesto, no he tenido ningún problema con XP. Lo he usado por más de cuatro años.

¿Mencioné que es la mejor utilidad para el uso de monitores múltiples?

2

El escritorio es solo un control ListView y puede obtener su identificador y enviar mensajes a él para mover iconos con LVM_SETITEMPOSITION.

Sin embargo, obtener posiciones de iconos usando LVMGETITEMPOS es un poco más complicado. Debe pasar un puntero a una estructura POINT como su LPARAM. Si intentas hacer eso, es probable que bloquees Explorer. El problema es que le pasó un puntero en su espacio de direcciones, que el control interpretó como un puntero en el espacio de direcciones del explorador. ¡Ay!

La solución que he usado es inyectar una DLL en el proceso de Explorer y enviar el mensaje desde allí. Entonces solo tienes que tener una forma de recuperar la información de posición a tu proceso.

+2

Tenga en cuenta que puede que no necesite inyectar un archivo DLL: puede enviar el mensaje desde fuera de proceso, y usar VirtualAllocEx y Read/WriteProcessMemory para configurar la memoria en el espacio de proceso del explorador, para que tenga un puntero LPARAM válido (desde el punto de vista del explorador) para usar. De esta forma, evita tener que volver a comunicarse con su propio proceso o tratar con una DLL por separado. – BrendanMcK

Cuestiones relacionadas