В какой-то момент, например, Win2k / WinXP, рабочий стол на самом деле был типом ListView. Я не уверен, что это все еще так в новых ОС. Зная, что было легко получить дескриптор рабочего стола, и с помощью API-функций LV манипулируют им, чтобы выполнять такие вещи, как отображение в стиле отчета.
Вот две функции, которые показывают, как начать манипулировать рабочим столом.
Примечание: я знаю, что это работает до WinXP, и я предполагаю, что это будет работать для Vista и Win7, но я не проверял это. Используя эти примеры, вам не понадобится много времени, чтобы написать набор функций для получения / установки положения значков всего на рабочем столе.
procedure ReportStyleDesktop;
var
wHandle : THandle;
wStyle : Longint;
begin
wHandle := GetDesktopWindow;
if wHandle <> 0 then
wHandle := FindWindowEx(wHandle, 0, 'Progman', 'Program Manager');
if wHandle <> 0 then
wHandle := FindWindowEx(wHandle, 0, 'SHELLDLL_DefView', 0);
if wHandle <> 0 then
wHandle := FindWindowEx(wHandle, 0, 'SysListView32', 0);
if wHandle <> 0 then
begin
wStyle := GetWindowLong(wHandle, GWL_STYLE);
wStyle := wStyle and (not LVS_TYPEMASK);
wStyle := wStyle or LVS_REPORT or LVS_ICON;
SetWindowLong(wHandle, GWL_STYLE, wStyle);
end;
end;
procedure NormalStyleDesktop;
var
wHandle : THandle;
wStyle : Longint;
begin
wHandle := GetDesktopWindow;
if wHandle <> 0 then
wHandle := FindWindowEx(wHandle, 0, 'Progman', 'Program Manager');
if wHandle <> 0 then
wHandle := FindWindowEx(wHandle, 0, 'SHELLDLL_DefView', 0);
if wHandle <> 0 then
wHandle := FindWindowEx(wHandle, 0, 'SysListView32', 0);
if wHandle <> 0 then
begin
wStyle := GetWindowLong(wHandle, GWL_STYLE);
wStyle := wStyle and (not LVS_TYPEMASK);
wStyle := wStyle or LVS_ICON;
SetWindowLong(wHandle, GWL_STYLE, wStyle);
end;
end;