Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1085423020
Олег
2004-05-24 22:23
2004.06.06
Как устранить мерцание формы при смене её стиля в runtime ?


1-1085546834
Анатолий
2004-05-26 08:47
2004.06.06
Блокирование файлов как винда блокирует некоторые свои


6-1082466294
Alan2
2004-04-20 17:04
2004.06.06
Проверка сайта на обновление


1-1085639652
ilnarab
2004-05-27 10:34
2004.06.06
Как извлечь имя файла


1-1085072138
Nikoss
2004-05-20 20:55
2004.06.06
Как узнать порядковый номер объекта в динам. массиве ...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский