Программное размещение значков на рабочем столе

Я ищу способ программно получить / установить положение значков на рабочем столе. Ясно, что где-то хранится какое-то «состояние». Кто-нибудь знает здесь?

Я пытаюсь получить доказательство концепции на ЛЮБОЙ платформе, поэтому, если вы знаете, как это сделать на XP в gnome, KDE или Mac OS, мне бы очень хотелось услышать об этом.


person ivan    schedule 22.06.2009    source источник
comment
Я не думаю, что вы должны делать это в Windows. Конечно, это не означает, что вы не можете, но это может быть сложно, недокументировано или легко взломать (см. Мой ответ).   -  person Andrew Keeton    schedule 23.06.2009


Ответы (6)


Начните здесь: http://msdn.microsoft.com/en-us/library/bb773177(VS.85).aspx.

К сожалению, это довольно неприятный API, потому что каждый объект в оболочке идентифицируется так называемым PIDL, который был создан самим сатаной, чтобы сбить с толку любого, кто пытается избежать нарушений доступа и утечек памяти.

person Daniel Earwicker    schedule 22.06.2009

Положение обычных файлов и папок сохраняется в скрытом файле .DS_Store, который существует для любого каталог Расположение значков громкости в Mac OS X, похоже, хранится в Finders .plist (~ / Library / Preferences / com.apple.finder).

person Thomas Zoechling    schedule 22.06.2009

Для настольных компьютеров, соответствующих спецификациям freedesktop.org (какими бы дефектными они ни были), соответствующий документ выглядит так: здесь; однако он ничего не говорит о позициях.

person pmf    schedule 22.06.2009

Многие ответы здесь говорят о том, что делать такие вещи в Windows довольно сложно. Подозреваю, что это не случайно. Если вы никогда не читали блог Раймонда Чена The Old New Thing, я советую вам это сделать. Г-н Чен часто обсуждает подводные камни и злоупотребления, возникающие при программном доступе к таким вещам, как размещение значков.

Изменить: вот несколько комментариев о разрешении программного доступа в Windows.

Хотя вы, вероятно, не предназначены для этого (по крайней мере, в Windows), это не значит, что это невозможно. Я просто прошу вас делать это в духе добра, а не зла.

person Andrew Keeton    schedule 22.06.2009

Я пытался изучить это пару раз за последние пару лет, это кажется такой тривиальной вещью (это было для рабочей среды AmigaDos), но программировать для оболочки Windows некрасиво; на самом деле программировать что-либо в Windows API некрасиво. Это ужасный беспорядок. Будьте готовы к выдергиванию пучка волос и боли в сердце.

Чтобы не обескураживать вас, но MicroSoft считает, что лучше всех знает, когда дело доходит до размещения значков в представлениях папок, и я почти не нашел способа реализовать «постоянное» размещение значков (то есть представление значков далеко не постоянное). Документы MSDN мало помогают в этом отношении (по крайней мере, нет примеров). Последнее, на что я обращал внимание, - это написать расширение оболочки для записи и восстановления положения значков (я бы не стал записывать их в реестр, я просто собирался сохранять позиции в файле desktop.ini папки, но, вероятно, было бы лучше создать файл в папке личных настроек пользователя).

В Code Project есть ряд статей о программировании и расширениях оболочки.

http://www.codeproject.com/KB/shell/ http://www.codeproject.com/KB/shell/shlext.aspx

Я закончил тем, что написал свою собственную небольшую оболочку на красивом чистом чистом C ++, который делает именно то, что я хочу в контексте моего приложения.

person Roger Nelson    schedule 22.06.2009

В GNOME Nautilus хранит положение значков и прочего в ~ / .nautilus / metafiles.

Файлы там имеют уродливые имена файлов, поскольку на самом деле это экранированные URI. Например, мои метаданные для значков на рабочем столе находятся в ~ / .nautilus / metafiles / file:% 2F% 2F% 2Fhome% 2Ffederico% 2FDesktop.xml

Однако нет общедоступного интерфейса для доступа или изменения этих данных. Конечно, вы можете самостоятельно проанализировать файл и изменить его, но изменения не вступят в силу до следующего перезапуска Nautilus.

person Federico Mena-Quintero    schedule 16.07.2009