Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.08.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.006 c
15-1213998563
Германн
2008-06-21 01:49
2008.08.10
О сканерах


9-1172925794
PARUS
2007-03-03 15:43
2008.08.10
"Игра" - потестите


15-1214285799
Slider007
2008-06-24 09:36
2008.08.10
С днем рождения ! 24 июня 2008 вторник


4-1193920429
-=[ajax]=-
2007-11-01 15:33
2008.08.10
"Пройденное растояние"


15-1214169103
JetuS
2008-06-23 01:11
2008.08.10
Сниффер ICMP-пакетов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский