Как я могу программно манипулировать расположением значков на рабочем столе Windows?

StackOverflow https://stackoverflow.com/questions/131690

Вопрос

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

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

Спасибо, Ричард

Это было полезно?

Решение

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

Я немного погуглил код C# и не смог найти пример, но нашел следующую статью. Торри:...получить/установить положение значков на рабочем столе?.Это код Delphi, но я считаю его очень читабельным, и с помощью некоторых P/Invoke вы сможете перевести его на C#.

Другие советы

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

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

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

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

Перетасовка значков на рабочем столе с использованием межпроцессного взаимодействия с памятью

и это, вероятно, станет основой моего кода.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top