Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как по хэндлу получить список файлов рабочего стола в TListBox? [D6, WinXP]


Volf_555 ©   (2006-03-19 13:06:00) 

Для получения хэндла рабочего стола использую следующую функцию:

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;

Как теперь получить список файлов на рабочем столе по хэндлу?
PS: И где можно прочитать статьи по работе с окнами после получения их хэндла?


Volf_555   (2006-03-20 23:33:00) [1]

Аналогичный ответ уже был на получение файлов с рабочего стола

> Volf_555 ©   (19.03.06 13:12) [2]
>
> > API ©   (19.03.06 13:08) [1]
> > C:\Documents and Settings\<UserName>\Рабочий стол
>
> Меня интересует работа через handle окна


VirEx   (2006-03-20 22:21:00) [2]

>  [5] Volf_555 ©   (20.03.06 21:52)
> Извиняюсь - они объявлены как глобальные... не заметил сразу...
>
> Но результат работы программы всё-равно не тот, который
> нужен, так как результатом работы программы есть вывод на
> экран размеров всех файлов на рабочем столе в килобайтах!
>
>
> А мне нужны сами файлы (имена их)


тогда C:\Documents and Settings\<UserName>\Рабочий стол
получай инфу от ярлыков, затем по инфе получай размер файла


Volf_555   (2006-03-20 21:52:00) [3]

Извиняюсь - они объявлены как глобальные... не заметил сразу...

Но результат работы программы всё-равно не тот, который нужен, так как результатом работы программы есть вывод на экран размеров всех файлов на рабочем столе в килобайтах!

А мне нужны сами файлы (имена их)


Volf_555   (2006-03-20 20:39:00) [4]

Выскакивают следующие ошибки при компиляции:

[Error] Unit1.pas(48): Undeclared identifier: 'MeLW'
[Error] Unit1.pas(57): Undeclared identifier: 'its'
[Error] Unit1.pas(58): Undeclared identifier: 'bufs'

Так как MeLW, itsи bufsнигде не объявлены


Andrey.Ru   (2006-03-19 21:33:00) [5]

Вот тебе через АПИ

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, CommCtrl;

type
 TForm1 = class(TForm)
   Button1: TButton;
   ListBox1: TListBox;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 MeLW : HWND;
 its, bufs : Pointer;

implementation

{$R *.dfm}
//------------------------------------------------------------------------------
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
   Hw : HWND;
   hh, c : integer;
   it : TLVItem;
   buf : array [0..32] of char;
   pid, bw : Cardinal;
 begin
   MeLW := GetDesktopListViewHandle;
   hh := SendMessage(MeLW, LVM_GETITEMCOUNT, 0, 0);
   GetWindowThreadProcessId(MeLW, pid);
   Hw := OpenProcess(PROCESS_VM_OPERATION or
                     PROCESS_VM_READ or
                     PROCESS_VM_WRITE or
                     PROCESS_QUERY_INFORMATION,
                     false,
                     pid);
   its := PLVItem(VirtualAllocEx(Hw, nil, sizeof(TLVItem), MEM_COMMIT, PAGE_READWRITE));
   bufs := pchar(VirtualAllocEx(Hw, nil, 512, MEM_COMMIT, PAGE_READWRITE));
   it.cchTextMax := 32;
   it.iSubItem:=1;
   it.pszText:=bufs;
   WriteProcessMemory(Hw, its, @it, sizeof(TLVItem), bw);
   for c:=0 to hh-1 do
     begin
       SendMessage(MeLw, LVM_GETITEMTEXT, c, lparam(its));
       ReadProcessMemory(Hw, bufs, @buf, 32, bw);
       ListBox1.Items.Add(buf);
     end;
   VirtualFreeEx(hw, its, 0, MEM_RELEASE);
   VirtualFreeEx(hw, bufs, 0, MEM_RELEASE);
 end;
//------------------------------------------------------------------------------
end.


Volf_555   (2006-03-19 13:12:00) [6]


> API ©   (19.03.06 13:08) [1]
> C:\Documents and Settings\<UserName>\Рабочий стол

Меня интересует работа через handleокна


API   (2006-03-19 13:08:00) [7]

C:\Documents and Settings\<UserName>\Рабочий стол


Наверх

Титульная страница Поиск, карта сайта Написать письмо