2008-09-25 2 views
23

Несколько лет назад я невинно попытался написать небольшое приложение, чтобы сохранить мои тактически размещенные значки рабочего стола, потому что мне было больно перетаскивать их обратно в свои места, когда какое-то событие их сбросило. Я сдался после того, как слишком много времени не смог найти способ запроса, а тем более сохранить и сбросить настройки рабочего стола моих значков.Как я могу программно манипулировать местоположениями значков рабочего стола Windows?

Кто-нибудь знает, где Windows продолжает эту информацию, и если есть API для их установки?

Спасибо, Richard

ответ

10

Если я не ошибаюсь, рабочий стол - это просто ListView, и вам нужно будет отправить сообщение LVM_SETITEMPOSITION на дескриптор рабочего стола.

Я немного поработал над некоторым кодом C# и не смог найти пример, но нашел следующую статью. Torry: ...get/set the positions of desktop icons?. Это delphi-код, но я считаю его очень читаемым и с некоторыми P/Invokes вы сможете перевести его на C#.

+0

Я начал использовать этот код в качестве основы, но затем, когда я что-то искал, нашел ссылку, которую я опубликовал в качестве ответа, поэтому я благодарю вас за ответ, спасибо. – ZeroBugBounce 2008-09-26 16:38:08

+0

Эти ссылки теперь кажутся мусором ... – 2015-02-01 22:52:07

0

Я понятия не имею о API, но я знаю UltraMon (http://www.realtimesoft.com/ultramon/) имеет функцию, включенную для сохранения размещения значка (хотя я никогда не использовал его для сохранения расположения иконок, то незаменимый для использования нескольких мониторов). Последняя бета-версия работает безупречно с Vista (за исключением того, что иногда с небольшим сбоем или двумя при первом входе в мою машину через RDP), и, конечно же, не было никаких проблем с XP. Я использовал его уже более четырех лет.

И я упомянул, что это лучшая утилита для использования нескольких мониторов?

2

Рабочий стол - это просто элемент управления ListView, и вы можете получить его дескриптор и отправить ему сообщения, чтобы перемещать значки вокруг, используя LVM_SETITEMPOSITION.

Получение позиций значков с использованием LVMGETITEMPOS немного сложнее. Вы должны передать указатель на структуру POINT как ваш LPARAM. Если вы попытаетесь это сделать, вы, вероятно, столкнетесь с Explorer. Проблема в том, что вы передали ему указатель в своем адресном пространстве, который элемент управления интерпретируется как указатель в адресном пространстве проводника. Ой!

Решение, которое я использовал, - это ввести DLL в процесс проводника и отправить сообщение оттуда. Тогда вам просто нужно получить информацию о позиции обратно в ваш процесс.

1

Я все еще смотрю на это и опубликую результат, как только я наконец получу что-то работающее. Я отправляю это, потому что, благодаря косвенно к сообщению Дэви, я также нашел классическую реализацию VB:

Shuffle Desktop Icons Using Interprocess Memory Communication

и что, вероятно, будет основой для моего кода.

Смежные вопросы