Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2013, 04:35   #1
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию Позиция названия и тип иконок на рабочем столе (частично готовая функция)

Есть код получения позиций ярлыков на рабочем столе, он прекрасно работает, но я не понимаю как получить названия ярлыков и тип (папка/файл/ярлык, возможно из названия вытянуть надо как-нибудь(./.*/.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;
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисовалка на рабочем столе Downloads Общие вопросы Delphi 10 27.06.2012 23:12
Анимация на рабочем столе Djonik Помощь студентам 2 09.12.2009 19:58
Значки на рабочем столе Xardas Свободное общение 4 01.03.2008 20:21
SpeedButton на рабочем столе ERASERROR Общие вопросы Delphi 10 22.01.2008 16:58
html на рабочем столе >AdepT< Win Api 4 28.02.2007 20:06