Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизДостучаться до небес... Тьфу. Значков! Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.048 c