Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

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

Здравствуйте, Програмеры.

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

Ответить   Wed, 16 Mar 2005 22:53:21 +0600 (#334178)

 

Ответы:

Здравствуйте, 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.

Ответить   Feniks Thu, 17 Mar 2005 10:44:22 +0200 (#334752)

 

Здравствуйте, Feniks.

Вы писали 17 марта 2005 г., 14:44:22:

Это у меня есть, как узнать координаты нужного значка?

Ответить   Thu, 17 Mar 2005 18:05:07 +0600 (#334830)

 

Здравствуйте !


Есть

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

Ответить   Sun, 20 Mar 2005 00:48:43 +0300 (#336426)

 

Здравствуйте, Victor.

Вы писали 20 марта 2005 г., 3:48:43:


Если Вас не затруднит.

Ответить   Sun, 20 Mar 2005 09:04:06 +0600 (#336492)

 

Здравствуйте !


Вобщем, технология такова.
Сначала надо в адресном пространсте чужого процесса (том, чьим окном надо
управлять, или собирать о нем инфу) заиметь свой исполняемый код.
Засунуть код в чужой процесс можно несколькими способами.
Самый легкий - хуки.
Есть еще, конечно 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

Ответить   Wed, 23 Mar 2005 00:38:24 +0300 (#338101)

 

Здравствуйте, Victor.

Вы писали 23 марта 2005 г., 3:38:24:



Можно подробнее, или пример простенький с применение м хуков.

Ответить   Thu, 24 Mar 2005 18:55:29 +0600 (#339118)