Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.10;
Скачать: CL | DM;

Вниз

Количество ярлыков   Найти похожие ветки 

 
Ya   (2008-07-08 01:20) [0]

Хай All!!!
 Может и не простой вопросик...
 Как определить количество ярлыков на рабочем столе?


 
Германн ©   (2008-07-08 01:24) [1]


>  Как определить количество ярлыков на рабочем столе?
>

FindFirst, FindNext, FindClose.


 
Amoeba ©   (2008-07-08 01:30) [2]

Используя ф-ию из ShellApi
SHGetSpecialFolderPath с параметром nFolder CLISD_COMMON_DESKTOPDIRECTORY
получаем путь к папке рабочего стола. Затем используя FindFirst, FindNext и CloseFind находим все *.lnk


 
Юрий Зотов ©   (2008-07-08 05:40) [3]

Одного CLISD_COMMON_DESKTOPDIRECTORY маловато будет, получим только общие для всех юзеров ярлыки. То же самое надо проделать еще и с CSIDL_DESKTOPDIRECTORY, тогда в сумме получим сабж.


 
KilkennyCat ©   (2008-07-08 06:38) [4]


> Юрий Зотов ©   (08.07.08 05:40) [3]

Именно в сумме? То есть, CSIDL_DESKTOPDIRECTORY не учитывает CLISD_COMMON_DESKTOPDIRECTORY?


 
Юрий Зотов ©   (2008-07-08 06:51) [5]

> KilkennyCat ©   (08.07.08 06:38) [4]

Каждый параметр позволяет только получить путь к каталогу, искать же ярлыки придется через FindFirst/Next/Close.

Я посмотрел содержимое обоих каталогов у себя (WinXP). В User не повторяются ярлыки, которые есть в Common - поэтому надо суммировать.


 
Slym ©   (2008-07-08 08:29) [6]

Рихтер писал про сохранение позиций ярлыков на десктопе... Можно колво оттуда вырезать
Джеффри РИХТЕР->Создание эффективных WIN32-приложений->ГЛАВА 22 Внедрение DLL и перехват API-вызовов->Утилита для сохранения позиций элементов на рабочем столе


 
Правильный^Вася   (2008-07-08 10:48) [7]

является ли "мой компьютер" или "корзина" ярлыком для автора?
на них ярлык не предоставляется...


 
Amoeba ©   (2008-07-08 13:37) [8]


> Правильный^Вася   (08.07.08 10:48) [7]
>
> является ли "мой компьютер" или "корзина" ярлыком для автора?
>
> на них ярлык не предоставляется...

Если автора они тоже интересуют, то нужно дополнительно лезть в реестр.


 
Rouse_ ©   (2008-07-08 14:12) [9]

как-то так...

////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * Unit Name : RemoteSysListView32
//  * Purpose   : Демо работы с удаленным SysListView32
//  * Author    : Александр (Rouse_) Багель
//  * Copyright : © Fangorn Wizards Lab 1998 - 2007
//  * Version   : 1.01
//  * Home Page : http://rouse.drkb.ru
//  ****************************************************************************
//

program RemoteSysListView32;

{$APPTYPE CONSOLE}

uses
 Windows,
 SysUtils,
 CommCtrl;

var
 hwndRemoteSysListView: HWND = 0;
 hProcess: THandle = 0;
 dwProcessID: DWORD = 0;
 dwBytesWriten: DWORD;
 nItemCount: Integer = 0;
 I, nTextLength: Integer;
 cchTextMax: Integer = 255;
 plviRemoteLVItem: PLVItem = nil;
 lviRemoteLVItem: LV_ITEM;
 pszText: PChar = nil;
 svText: ShortString;
 ARect: TRect;
 pRemoteRect: Pointer = nil;

 function GetFirstChild(hwndValue: HWND): HWND;
 begin
   Result := GetWindow(hwndValue, GW_CHILD);
 end;

 function Translate(Value: String): String;
 begin
   SetLength(Result, Length(Value));
   AnsiToOem(@Value[1], @Result[1]);
 end;

begin
 // Ищем SysListView32 рабочего стола
 hwndRemoteSysListView := GetFirstChild(GetFirstChild(FindWindow("ProgMan", nil)));
 if hwndRemoteSysListView = 0 then ExitProcess(GetLastError);

 // Получаем количество элементов (ярлыков на рабочем столе)
 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);

 // Получаем текст со всех элементов
 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);

   Writeln(Translate(PChar(@svText[1])));
   Writeln(Translate(
     Format("- координаты: Left = %d, Top = %d, Right = %d, Bottom = %d",
       [ARect.Left, ARect.Top, ARect.Right, ARect.Bottom])));

 end;

 // Освобождаем ранее выделенную память
 VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
 VirtualFreeEx(hProcess, plviRemoteLVItem, 0, MEM_RELEASE);

 // Закрываем описатель процесса
 CloseHandle(hProcess);

 Readln;
end.


 
Правильный^Вася   (2008-07-08 15:34) [10]


> Rouse_ ©   (08.07.08 14:12) [9]

ай, а почему память освобождается только в случае удачи?


 
Rouse_ ©   (2008-07-08 15:40) [11]


> ай, а почему память освобождается только в случае удачи?

А потомучто это демка, т.е. отправная точка для думалки :)


 
Anatoly Podgoretsky ©   (2008-07-08 16:12) [12]

> Правильный^Вася  (08.07.2008 15:34:10)  [10]

А нафига нам неудачники?


 
Правильный^Вася   (2008-07-08 16:30) [13]


> Anatoly Podgoretsky ©   (08.07.08 16:12) [12]

а правильно, засрем память неудачника, пусть тренируется



Страницы: 1 вся ветка

Текущий архив: 2008.08.10;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
15-1214471303
denic
2008-06-26 13:08
2008.08.10
Панель компонентов -> вкладка ActiveX ->


2-1215418440
Irina_GR
2008-07-07 12:14
2008.08.10
QReport


2-1215575714
Muh
2008-07-09 07:55
2008.08.10
Как в цикле перебрать допустим combobox1, combobox2


2-1215334184
Циркуль
2008-07-06 12:49
2008.08.10
Печатаются крякозябры


15-1214300632
Kostafey
2008-06-24 13:43
2008.08.10
Помогите составить SQL - запрос (выборка по последней дате)