Рабочий стол перекрыт сверху компонентом ListView. Вам просто необходимо взять хэндл этого органа управления. Пример:

 

Как получить и изменить координаты иконок на столе?

Previous  Top  Next

 

Code:

uses

CommCtrl,

IPCThrd; (from your Delphi\Demos\Ipcdemos directory)

 

function GetDesktopListViewHandle: THandle;

var

S: String;

begin

Result := FindWindow('ProgMan', nil);

Result := GetWindow(Result, GW_CHILD);

Result := GetWindow(Result, GW_CHILD);

SetLength(S, 40);

GetClassName(Result, PChar(S), 39);

if PChar(S) <> 'SysListView32' then Result := 0;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

type

  PInfo = ^TInfo;

  TInfo = packed record

    infoPoint: TPoint;

    infoText: array[0..255] of Char;

    infoItem: TLVItem;

    infoFindInfo: TLVFindInfo;

  end;

var

  r : TRect;

  hWnd : THandle;

  i, iCount : Integer;

 

  Info: PInfo;

  SharedMem: TSharedMem;

begin

hWnd := GetDesktopWindow();

GetWindowRect(hWnd,r);

Memo.Lines.Add('Bottom: ' +  IntToStr(r.Bottom));

Memo.Lines.Add('Right: ' + IntToStr(r.Right));

 

hWnd := GetDesktopListViewHandle;

iCount := ListView_GetItemCount(hWnd);

Memo.Lines.Add('# Icons: ' + IntToStr(iCount));

 

SharedMem := TSharedMem.Create('', SizeOf(TInfo));

Info := SharedMem.Buffer;

 

  with Info^ do

  try

    infoItem.pszText := infoText;

    infoItem.cchTextMax := 255;

    infoItem.mask := LVIF_TEXT;

    try

      begin

        for i := 0 to iCount - 1 do

        begin

          infoItem.iItem := i;

          try

            ListView_GetItem(hWnd, infoItem);

            ListView_GetItemPosition(hWnd, I, infoPoint);

            Memo.Lines.Add('Icon: ' + infoText);

            Memo.Lines.Add('   X: ' + IntToStr(infoPoint.X));

            Memo.Lines.Add('   Y: ' + IntToStr(infoPoint.Y));

          except

          end;

        end;

      end;

    finally

    end;

  finally

    SharedMem.Free;

  end;

end;

 

 

Code:

// переменные

var Srect,Drect,PosForme:TRect;

   iWidth,iHeight,DmX,DmY:Integer;

   iTmpX,iTmpY:Real;

   C:TCanvas;

   Kursor:TPoint;

// Увеличиваем экран, если приложение не свёрнуто в иконку

If not IsIconic(Application.Handle) then begin

// Получаем координаты курсора

GetCursorPos(Kursor);

 

// PosForm представляет прямоугольник с

// координатами Form (image control).

PosForme:=Rect(Form1.Left,

                Form1.Top,

                Form1.Left+Form1.Width,

                Form1.Top+Form1.Height);

 

//Показываем magnified screen

//если курсор за пределами формы.

If not PtInRect(PosForme,Kursor) then begin

 

// Далее код можно использовать для увеличения выбранной

// части экрана. С небольшими модификациями его можно

// использовать для уменьшения

// экрана

iWidth:=Image1.Width;

iHeight:=Image1.Height;

Drect:=Bounds(0,0,iWidth,iHeight);

iTmpX:=iWidth / (Slider.Position * 4);

iTmpY:=iHeight / (Slider.Position * 4);

Srect:=

 

  Rect(Kursor.x,Kursor.y,Kursor.x,Kursor.y);

InflateRect(Srect,Round(iTmpX),Round(iTmpY));

 

//Получаем обработчик(handle) окна рабочего стола.

C:=TCanvas.Create;

try

  C.Handle:=GetDC(GetDesktopWindow);

//Передаём часть изображения окна в TImage.

  Image1.Canvas.CopyRect(Drect,C,Srect);

finally

  C.Free;

end;

 

end;

 

// Обязательно обрабатываем все сообщения Windows.

Application.ProcessMessages;

 

end; // IsIconic

 Автор: Zarko Gajic

 

Code:

function IsActiveDeskTopOn: Boolean;

var

h: hWnd;

begin

h := FindWindow('Progman', nil);

h := FindWindowEx(h, 0,

            'SHELLDLL_DefView', nil);

h := FindWindowEx(h, 0,

      'Internet Explorer_Server', nil);

Result := h <> 0;

end;

 

 

Как установить обои в формате jpeg. SystemParametersInfo только для bmp.

  

Code:

procedure TForm1.Button1Click(Sender: TObject);

begin

// скрыть иконки

ShowWindow(FindWindow(nil,'Program Manager'),SW_HIDE);

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

// показать иконки

ShowWindow(FindWindow(nil,'Program Manager'),SW_SHOW);

end;

 

 

Для этого нужно найти окно "SysListView32" (которое является списком, который содержит иконки рабочего стола). Сперва будем искать главное родительское окно "Progman", которое содержит дочернее окно "SHELLDLL_DefView" , которое в свою очередь имеет дочернее окно "SysListView32". Для этого можно воспользоваться API функцией FindWindow to. Когда Мы получим дескриптор окна "SysListView32", то можно будет воспользоваться макросами ListView_SetTextBkColor и ListView_SetTextColor для установки желаемого цвета.

 

 

Code:

uses

ComObj, ShlObj, ActiveX;

 

procedure EnableActiveDesktop(bValue: Boolean);

const

CLSID_ActiveDesktop: TGUID = (D1: $75048700; D2: $EF1F; D3: $11D0;

   D4: ($98, $88, $00, $60, $97, $DE, $AC, $F9));

var

MyObject: IUnknown;

ActiveDesk: IActiveDesktop;

twpoComponentOpt: TComponentsOpt;

begin

MyObject := CreateComObject(CLSID_ActiveDesktop);

ActiveDesk := MyObject as IActiveDesktop;

with twpoComponentOpt do

begin

   ZeroMemory(@twpoComponentOpt, SizeOf(TComponentsOpt));

   dwSize := SizeOf(twpoComponentOpt);

   fEnableComponents := bValue;

   // fActiveDesktop := True;

end;

ActiveDesk.SetDesktopItemOptions(twpoComponentOpt, 0);

ActiveDesk.ApplyChanges(AD_APPLY_ALL);

end;

 

 

Иногда важно знать, какую часть экрана можно занимать, не перекрывая тем самым такие окна, как TaskBar. Эта программа разворачивает окно на всю рабочую область Desktop'а.

В принципе, все настройки на фоновый рисунок хранятся в реестре. Поэтому надо сначала скопировать картинку в какое-нибудь место (лучше в каталог Виндов) на случай удаления или переноса исходного файла. Информация по обоям хранится в разделе HKEY_CURRENT_USER\Control Panel\Desktop в параметрах TileWallpaper (если 1 - рисунок размножен, 0 - в центре), Wallpaper - путь к файлу обоев (gif, bmp, jpg), WallpaperStyle - если 2, то обои будут растянуты (отсутствует в 95 винде).

ПОсле установки всех занчений обновляешь рабочий стои и наслаждаешься эффектом.

 

Автор ответа: Garik

Автор: William Egge

 

Весёлая программка, которая позволяет подшутить над Вашими друзьями:-]. Пример переворачивает десктоп и держит его в таком положение, до тех пор пока не кликнуть по нему мышкой. По мимо этого код содержит в себе довольно интересные моменты.