Windows - gerenciando o desktop

Top  Previous  Next

// Este primeiro exemplo veio do livro 365 dicas de Delphi:

==========================================================================

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls, CommCtrl;

 

// Este eu testei e FUNCIONA só no Win9x

 

type

  TForm1 = class(TForm)

    Label1: TLabel;

    ListBox1: TListBox;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

  private

    DskList : hWnd;

  public

    { Public declarations }

  end;

 

  PInfo = ^TInfo;

  TInfo = packed record

    Text: array[0..255of Char;

    Item: TLVItem;

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.FormCreate(Sender: TObject);

var

  NumItens : Integer;

  Info : PInfo;

  i : Integer;

  Handle : THandle;

begin

  DskList := FindWindowEx(GetDesktopWindow,0,'Progman','Program Manager');

  DskList := FindWindowEx(DskList,0,'ShellDLL_DefView',nil);

  DskList := FindWindowEx(DskList,0,'SysListView32',nil);

  NumItens := ListView_GetItemCount(DskList);

  Label1.Caption := 'Número de itens - '+IntToStr(NumItens);

  Handle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,

        Sizeof(TInfo), '');

  if Handle = 0 then

    Abort;

  Info := MapViewOfFile(Handle, FILE_MAP_WRITE, 00, Sizeof(TInfo));

  try

    with Info^ do begin

      Item.pszText := Text;

      Item.cchTextMax := 255;

      Item.mask := LVIF_TEXT;

      for i := 0 to NumItens - 1 do begin

        Item.iItem := i;

        Item.iSubItem := 0;

        ListView_GetItem(DskList, Item);

        Listbox1.Items.Add(String(Item.pszText));

      end;

    end;

  finally

    UnmapViewOfFile(Info);

  end;

end;

 

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  ListView_SetTextBkColor(DskList, $ffffffff);

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

  ListView_SetTextBkColor(DskList, clNavy);

end;

 

procedure TForm1.Button3Click(Sender: TObject);

begin

  ListView_Arrange(DskList,LVA_ALIGNTOP);

end;

 

===================================================================

 

...manage desktop icons ?

 

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;  

 

SendMessage(GetDesktopListViewHandle,LVM_ALIGN,LVA_ALIGNLEFT,0); 

 

For more LVM_ messages see win32.hlp

 

-------------------------------------------------------------------

 

TESTADO: Para pegar quantos itens tem no Desktop:

 

 

uses commctrl;

 

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);

var

  Item: TagLVITEMA;  // LV_ITEM;

  I, Total: Integer;

  H: HWND;

  P: TPoint;

begin

  H     := GetDesktopListViewHandle;

  Total := ListView_GetItemCount(H)-1;

  {

//  for I := 0 to Total-1 do

//  begin

//    Item.iItem := I;

//    Item.

//    ListView_GetItem( H, Item);

    I := 10;

    repeat

     I:= ListView_GetNextItem(H, I, LVNI_ALL);

     ListView_GetItemText(H, I, 0, P, 255);

     Memo1.Lines.Add( P );

     Inc(I);

    until I = 12;

//  end;

    }

//  SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0 ); // Isto força um F5 no Desktop

 

  Memo1.Lines.Add( 'Numero de items: ' + IntToStr(ListView_GetItemCount(H)));

//  ListView_SetTextBkColor(H, ColorToRGB( clBlack ));

//  ListView_SetItemPosition(H, 10, 200, 200);

//  SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0 ); // Isto força um F5 no Desktop

  for I := 0 to Total-1 do

  begin

    ListView_GetItemPosition(H, I, P);

    Memo1.Lines.Add( 'x: '  + IntToStr(P.x) + '   y:' + IntToStr(P.y));

  end;

end;

-------------------------------------------------------------------