Code:

procedure TForm1.Button1Click(Sender: TObject);

var

  Picture: TPicture;

  Desktop: TCanvas;

  X, Y: Integer;

begin

  // Objekte erstellen

// create objects

Picture := TPicture.Create;

  Desktop := TCanvas.Create;

 

  // Bild laden

// load bitmap

Picture.LoadFromFile('bitmap1.bmp');

 

  // Geratekontex vom Desktop ermitteln

// get DC of desktop

Desktop.Handle := GetWindowDC(0);

 

  // Position des Bildes

// position of bitmap

X := 100;

  Y := 100;

 

  // Bild zeichnen

// draw bitmap

Desktop.Draw(X, Y, Picture.Graphic);

 

  // Geratekontex freigeben

ReleaseDC(0, Desktop.Handle);

 

  // Objekte freigeben

// release objects

Picture.Free;

  Desktop.Free;

end;

 

 

Для начала необходимо получить дескриптор рабочего стола, который представляет из себя обычный 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:

procedure RefreshDesktop;

{©Drkb v.3}

 

var

c1 : cardinal;

begin

c1:=FindWindowEx(FindWindowEx(FindWindow('Progman','Program Manager'),,'SHELLDLL_DefView',''),0,'SysListView32','');

PostMessage(c1,WM_KEYDOWN,VK_F5,0);

PostMessage(c1,WM_KEYUP,VK_F5,1 shl 31);

end;

 

 

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;

 

 

 

Code:

ShellExecute(Application.Handle, 'open', 'desk.cpl', nil, nil, sw_ShowNormal);

Автор: Nomadic

  

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;

 

 

Для этого воспользуемся 'Rundll32.exe' и запустим её в 'shellexecute'. Не забудьте добавить 'shellapi' в Ваш список uses.

 

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;

 

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

 

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

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

 

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