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

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

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

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


person ZeroBugBounce    schedule 25.09.2008    source источник


Ответы (5)


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

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

person Davy Landman    schedule 25.09.2008
comment
Я начал использовать этот код в качестве основы, но затем, погуглив что-то из него, нашел ссылку, которую я разместил в качестве ответа, поэтому я отвечу вам за ответ, спасибо. - person ZeroBugBounce; 26.09.2008

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

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

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

person Ferruccio    schedule 25.09.2008
comment
Обратите внимание, что вам может не понадобиться внедрять DLL: вы можете отправить сообщение вне процесса и использовать VirtualAllocEx и Read/WriteProcessMemory для настройки памяти в пространстве процесса проводника, чтобы у вас был действительный указатель LPARAM (с точки зрения проводника). зрения) для использования. Таким образом, вам не придется связываться с вашим собственным процессом или иметь дело с отдельной библиотекой DLL. - person BrendanMcK; 29.07.2011

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

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

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

person ZeroBugBounce    schedule 26.09.2008

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

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

person Ted    schedule 25.09.2008

может быть, вам нужен этот? Я нахожу его в 《WindowsCoreProgramming 5th》 https://github.com/wang1902568721/WindowsCoreProgramming

person 4756C    schedule 14.08.2020