Форум: "Начинающим";
Текущий архив: 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.48 MB
Время: 0.007 c