Delphi координаты ярлыка

Здравствуйте, Програмеры.
Как узнать координаты произвольного значка на рабочем столе?
← Март 2005 → | ||||||
1
|
||||||
7
|
11
|
12
|
||||
За последние 60 дней ни разу не выходила
Сайт листа:
http://codeguru.ru
Открыт:
21-09-2003
Пре-модерация: Нет
Адрес для писем в лист: comp.soft.prog.prog-list@subscribe.ru
Адрес
модератора: comp.soft.prog.prog-owner@subscribe.ru
Здравствуйте, Програмеры.
Как узнать координаты произвольного значка на рабочем столе?
Здравствуйте, Feniks.
Вы писали 17 марта 2005 г., 14:44:22:
Это у меня есть, как узнать координаты нужного значка?
Здравствуйте !
Есть
BOOL ListView_GetItemPosition(
HWND hwnd,
int i,
POINT FAR *ppt
);
и сообщение
LVM_GETITEMPOSITION
wParam = (WPARAM) (int) i;
lParam = (LPARAM) (POINT FAR *) ppt;
З.Ы. Только эта функция тоже не будет работать из твоей проги
для рабочего стола (т.к. тоже - между процессами).
Если вкратце - то тут как видно, надо передать указатель на
структуру. Память выделена под структуру в твоем процессе,
другой процесс до нее не доберется.
Если надо - поясню как такие фишки делать (там надо в другой процесс
внедряться и через что то (способов много) взаимодействовать,
передавать
данные).
--
С уважением, Вахтуров Виктор.
Номер выпуска : 4154
Возраст листа : 546 (дней)
Количество подписчиков : 525
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/336426
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Здравствуйте !
Вобщем, технология такова.
Сначала надо в адресном пространсте чужого процесса (том, чьим окном надо
управлять, или собирать о нем инфу) заиметь свой исполняемый код.
Засунуть код в чужой процесс можно несколькими способами.
Самый легкий - хуки.
Есть еще, конечно Debug API (WriteProcessMemory) + VirtualAllocEx + RPC.
Или можно в Win2000 в каком то параметре реестра прописать ключик
(это искать надо в каком - сейчас не помню) прописать свою dll и она
будет подгружаться ко всем процессам в системе.
Но хук - это классика. Правда есть ограничения - в процессы, где нет
очереди сообщений, dll с хуком не загрузится (например в консольные).
Так вот...
Допустим, написали мы dll с хуком. В делфи, кажется, есть для этого даже
какие то развитые средства.
В этой dll при загрузке надо проверять в какой она процесс загружена.
И если загружена туда куда надо - пытаться связаться с другим приложением -
сервером.
То есть надо писать приложение-сервер, которое будет получать инфу у
внедренной dll или заставлять код той dll выполнять какие то действия.
О том, как передавать информацию между процессами.
Я просто опишу несколько способов - выбор за Вами (некоторые упомяну
просто потому что они есть). Итак. Средства Interprocess Communication:
Clipboard - (ведь передается через него инфа между
процессами?).
MMF - Memory Mapped Files (файлы, отображенные в
память)
Shared Sections - общие области памяти в dll, например.
Pipes - пайпы
Sockets - сокеты
Mail Slots - почтовые слоты
RPC - удаленный вызов процедур
COM - ком - он и есть ком с его маршалингом. Ныне
оно
базируется на RPC
WM_COPYDATA - сообщение есть такое. Как раз для
копирования данных
между процессами. Работает через MMF.
DDE - технология старая.
WriteProcessMemory - Debug API. Для простых задаяч его
использовать не стоит.
Для задачи управления иконками на рабочем столе я бы (если прога только для
себя пишется),
я бы выбрал взаимодействие через сообщения. Для передачи блоков данных
использовал бы
WM_COPYDATA. Это просто и привычно.
То есть в своей проге создается невидимое окно. Имя класса окна -
уникальное.
Когда dll с хуком грузится в процесс, она смотрит, а не explorer.exe ли этот
процесс ?
И, если да, то делает FindWindow - ищет окно того самого класса
(уникального).
Если находит, что делает что там надо. Получает координаты иконок, и.т.д.
и.т.п.
Кладет все это в буффер и шлет через WM_COPYDATA основному твоему
приложению.
В твоем приложении ты эту инфу достаешь и делаешь что там надо.
Усе.
dll, кстати, может в другом процессе запустить поток, создать также
невидимое окно
(или присоединиться к пайпу/засинхронизироваться для чения MMF/открыть
сокет, и.т.д.)-
короче, также создать некоторое средство для получения команд от сервера.
Кстати, м MSDN где то была статья (кажется, автор Paul DiLascia) - так вот
там как раз
какие то манипуляции с десктопом производились через dll с хуком.
--
С уважением, Вахтуров Виктор.
Номер выпуска : 4172
Возраст листа : 549 (дней)
Количество подписчиков : 530
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/338101
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Здравствуйте, Victor.
Вы писали 23 марта 2005 г., 3:38:24:
Можно подробнее, или пример простенький с применение м хуков.
Здравствуйте, janalex.
В письме mid:20050316200645.3341***@c*****.subscribe
Вы писали 16 марта 2005 г. в 18:53:21 [GMT +2:00]:
(Из рассылки посвященной программированию на Делфи) :
Рабочий стол перекрыт сверху компонентом ListView.
Вам просто необходимо взять хэндл этого органа управления.
Пример:
function GetDesktopListViewHandle: THandle;
var
S: String;
begin
Result := FindWindow('ProgMan', nil);
Result := GetWindow(Result, GW_CHILD);
Result := GetWindow(Result, GW_CHILD);
SetLength(S, 40);
GetClassName(Result, PChar(S), 39);
if PChar(S) 'SysListView32' then
Result := 0;
end;
После того, как Вы взяли тот хэндл, Вы можете использовать API этого
ListView, определенный в модуле CommCtrl, для того, чтобы
манипулировать рабочим столом.
Смотрите тему "LVM_xxxx messages" в оперативной справке по Win32.
К примеру, следующая строка кода:
{Не забудьте в uses добавить CommCtrl}
ListView_SetItemPosition(GetDesktopListViewHandle,i,x,y);
ярлыку с индексом i, задаст координаты (x,y).
К примеру Мой компьютер имеет индекс 0, т.е i:=0;
А следующая строка кода:
SendMessage( GetDesktopListViewHandle, LVM_ALIGN, LVA_ALIGNLEFT, 0 );
разместит иконки рабочего стола по левой стороне рабочего стола Windows.