Есть код получения позиций ярлыков на рабочем столе, он прекрасно работает, но я не понимаю как получить названия ярлыков и тип (папка/файл/ярлык, возможно из названия вытянуть надо как-нибудь(./.*/.lnk)?)
Помогите пожалуйста, этот код еле нарыл, а понять его не могу даже с описаниями. Пробовал сделать аналог, только вместо ректангла вытягивать название - шиш.
Код:
procedure onstart;
begin
// Ищем SysListView32 рабочего стола
hwndRemoteSysListView := GetFirstChild(GetFirstChild(FindWindow('ProgMan', nil)));
if hwndRemoteSysListView = 0 then ExitProcess(GetLastError);
getallpos;
end;
function GetFirstChild(hwndValue: HWND): HWND;
begin
Result := GetWindow(hwndValue, GW_CHILD);
end;
procedure TAppForm.getallpos;
begin
// Получаем количество элементов (ярлыков на рабочем столе)
nItemCount := ListView_GetItemCount(hwndRemoteSysListView);
// Получаем ID процесса, которому принадлежит найденное окно
GetWindowThreadProcessId(hwndRemoteSysListView, @dwProcessID);
if dwProcessID = 0 then ExitProcess(GetLastError);
// Открываем процесс
hProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessID);
if hProcess = 0 then ExitProcess(GetLastError);
// Выделяем в нем память под текстовый буффер
pszText := VirtualAllocEx(hProcess, nil, cchTextMax,
MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if GetLastError <> 0 then ExitProcess(GetLastError);
// Выделяем в нем память под структуру LVITEM
plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM),
MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if GetLastError <> 0 then ExitProcess(GetLastError);
// Заполняем структуру
ZeroMemory(@lviRemoteLVItem, SizeOf(LV_ITEM));
lviRemoteLVItem.mask := LVIF_TEXT;
lviRemoteLVItem.pszText := pszText;
lviRemoteLVItem.cchTextMax := cchTextMax;
// Пишем ее в память удаленного процесса
if not WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem,
SizeOf(LV_ITEM), dwBytesWriten) then ExitProcess(GetLastError);
// Выделяем в нем память под структуру TRect
pRemoteRect := VirtualAllocEx(hProcess, nil, SizeOf(TRect),
MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if GetLastError <> 0 then ExitProcess(GetLastError);
Iconcount:=nItemCount;
setlength(IconList,Iconcount);
for I := 0 to nItemCount - 1 do
begin
// Отправляем сообщение с указателем на выделенный буффер под LVITEM
nTextLength := SendMessage(hwndRemoteSysListView, LVM_GETITEMTEXT,
I, Integer(plviRemoteLVItem));
// Читаем результат
ZeroMemory(@svText, cchTextMax);
ReadProcessMemory(hProcess, lviRemoteLVItem.pszText,
@svText[1], nTextLength, dwBytesWriten);
// Чтобы получить координаты каждого элемента нужно подготовить структуру
ZeroMemory(@ARect, SizeOf(TRect));
ARect.Left := LVIR_ICON;
if not WriteProcessMemory(hProcess, pRemoteRect, @ARect,
SizeOf(TRect), dwBytesWriten) then ExitProcess(GetLastError);
// Посылаем сообщение для получения координат каждого элемента
SendMessage(hwndRemoteSysListView, LVM_GETITEMRECT,
I, Integer(pRemoteRect));
// Читаем результат
ReadProcessMemory(hProcess, pRemoteRect,
@ARect, SizeOf(TRect), dwBytesWriten);
IconList[i]:=arect;
end;
// Освобождаем ранее выделенную память
VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, plviRemoteLVItem, 0, MEM_RELEASE);
// Закрываем описатель процесса
CloseHandle(hProcess);
end;