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

Вниз

Достучаться до небес... Тьфу. Значков!   Найти похожие ветки 

 
uZver   (2004-05-23 18:49) [0]

Вопрос: как получить координаты значков с рабочего стола?
вопрос не такой простой как кажется, поскольку:

ListView_GetItemPosition(deskhndl,1,t);
а также
SendMessage(deskhndl, LVM_GETITEMPOSITION, 1, LongInt(@t));

вышибает експлорер в "прекрасное далеко" вызывая ошибку в COMCTL32.DLL

t:tpoint;
а deskhndl - хэндл рабочего стола

самое прикольное то что ListView_SetItemPosition работает на ура... а GetItemPosition вышибает...
Ничччего не понимаю!(с)Винни Пух

В общем кого жаба не задушит поделитесь плиз опытом получения координат значков из делфи?

Как вариант можно было бы путем перелопачивания реестра попробовать выяснить где винда ихние координаты хранит... И читать оттуда... Но искать замучаешься да и извращение вообще... :)


 
Mim1 ©   (2004-05-23 18:53) [1]


> самое прикольное то что ListView_SetItemPosition работает
> на ура... а GetItemPosition вышибает...

Это по той причине что адресное пространство другое. Рихтер про это расписывал хорошо, и с примером...


 
Cobalt ©   (2004-05-24 01:07) [2]

Это можно сделать, внедрившись в АП проводника. Например, при помощи хука :) (пример и объяснения про хуки смотри в разделе "Статьи")
Тогда можно будет в сообщениях использовать адреса переменных.


 
atruhin ©   (2004-05-24 07:04) [3]

Здесь была статья. Привожу как было. Непроверял.

Доступ к иконкам

Всё перетянуто из CommCtrl.pas

uses CommCtrl;
var i, k:Integer;
XYold,  XY : Array[1..100] of TPoint;
CurPos:TPoint;

Сначала получаем Handle DeskTop"a:

function GetHandle: 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;

Считаем количество иконок на столе:

...
i:=SendMessage(GetHandle,LVM_GETITEMCOUNT,0,0);
...

Получаем координаты иконок на столе. Как оказывается, это самое трудное.
Если посмотреть код GETITEMPOSITION в CommCtrl.pas, то его повтор в Delphi почему-то не работает. Т.е. он работает, но непонятно как:))
Поэтому делаем так:

function GetXY(hwndLV: HWND; i: Integer; var ppt:
TPoint): Bool;
var PointBuf : ^TPoint;
begin
try
PointBuf := VirtualAlloc(NIL,Sizeof(TPoint),
$8000000 or MEM_COMMIT, PAGE_READWRITE);
Result := Bool( SendMessage(hWndLV,
LVM_GETITEMPOSITION, i, Longint(PointBuf)));
if Result then begin
ppt.x := PointBuf^.x;
ppt.y := PointBuf^.y;
              end;
finally
VirtualFree(PointBuf,0,MEM_RELEASE);
end;
end;
...

Сохраняем координаты иконок в XYold:

for k:=1 to i do GetXY(GetHandle,k-1,XYold[k]);

Иконка с индексом 0 - всегда "Мой компьютер",
остальные - у кого как:))
...
А вот, как по таймеру двигать иконки туда-сюда, если
подвести к ним курсор:

procedure TForm1.Timer1Timer(Sender: TObject);
var k:Integer;
begin
GetCursorPos(CurPos);
for k:=1 to i do begin
GetXY(GetHandle,k-1,XY[k]);
if (CurPos.x>XY[k].x+4) and (CurPos.x
and (CurPos.y>XY[k].y+4) and (CurPos.y
then begin
SendMessage(GetHandle,LVM_SETITEMPOSITION,k-1,MakeLong(XY[k].x+Random(64)-Random(64),
XY[k].y+Random(64)-Random(64)));
end;
end;
end;
...

И, наконец, возвращаем все иконки на место перед
завершением программы:

procedure TForm1.FormDestroy(Sender: TObject);
var k:Integer;
begin
for k:=1 to i do
SendMessage(GetHandle,LVM_SETITEMPOSITION,k-1,MakeLong(XYold[k].x,XYold[k].y));
end;

Может быть эти фрагменты кому-нибудь помогут:)))
А моя программка до сих пор валяется на
http://freesoft.kulichki.net/katalog/ufen/5003.html

Yurik Yura (copyr25@yahoo.com)



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

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

Наверх




Память: 0.48 MB
Время: 0.04 c
3-1084723034
Oxer
2004-05-16 19:57
2004.06.06
Связи м/у таблмцами ("ручное" изменение значения ключа)


1-1085550988
Valeri
2004-05-26 09:56
2004.06.06
TEdit, курсор


6-1081938722
Andreas
2004-04-14 14:32
2004.06.06
Убрать меню в браузере


14-1084601263
Думкин
2004-05-15 10:07
2004.06.06
С днем рождения! 15 мая.


6-1082481420
Deff
2004-04-20 21:17
2004.06.06
Найти компь.теры в сети. Отобразить в виде дерева.