Главная страница
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.042 c
1-1085422899
td
2004-05-24 22:21
2004.06.06
Help в html


1-1085354446
Denich
2004-05-24 03:20
2004.06.06
Формула по random


14-1084881365
Андрей
2004-05-18 15:56
2004.06.06
Кольцо!


1-1085393347
sesh
2004-05-24 14:09
2004.06.06
Ведение логов


3-1084423055
vlgrig1961
2004-05-13 08:37
2004.06.06
Не понятно почему из TMemo в function появляются пустые строки