Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› MouseClick на item в ListView
Посл.ответ Сообщение

Ранг: 122.2 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 15 марта 2007 01:08
· Личное сообщение · #1

есть контрол SysListView32. как послать месседж MouseClick айтему с определенным индексом в этом контролле? можно не по индексу, но главное чтобы послать месседж конкретному айтему.
другими словами как эмулировать клик мышкой по айтему в лист вью?




Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 15 марта 2007 09:35
· Личное сообщение · #2

Можно вычислить положение итема и сделать так:
//переместили:
mouse_event(mouseeventf_absolute or mouseeventf_move, X, Y, 0, 0);
//надавили:
mouse_event(mouseeventf_absolute or mouseeventf_leftdown, X, Y, 0, 0);
//отпустили
mouse_event(mouseeventf_absolute or mouseeventf_leftup, X, Y, 0, 0);
Но это если поприкалываться хочешь И если окно активно. Я ведь так понял ты не в своем приложении нажатие эмулировать собираешься.
А так, надо получить хендл итема и отправить ему смску ))) с текстом WM_LBUTTONDOWN помоему..

-----
radio uno in ibisa ...




Ранг: 122.2 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 15 марта 2007 10:47
· Личное сообщение · #3

точно не в своем хочу. в том то и проблема, что непонятно как получить хендл итема. хендл лист вью - пожалуйста, а хендл итема не знаю как. да и твой вариант не сработает, если итем будет находиться вне видимости, то есть нужно сначала проскроллить. но я точно заню, что можно послать событие именно определенному итему. видел прогу которая так делает. только вот посмотреть как именно она это делает дюже сложно




Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 15 марта 2007 11:00
· Личное сообщение · #4

hParent := FindWindow (PChar('WinClass'),PChar('WinName'));
hListView := FindWindowEx(hParent, 0, PChar('TListView'), nil);
hItem := FindWindowEx( hListView, 0, PChar('TListItems'), nil{или текст из итема - х.з.});
Не знаю будет ли работать - просто предположение.

-----
radio uno in ibisa ...




Ранг: 122.2 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 15 марта 2007 11:11
· Личное сообщение · #5

я так понимаю что итем в листе не является окном. сейчас проверить просто не могу этот код. дома вечерком посмотрю, но думаю все таки что это не сработает, там скорее всего событие надо слать именно лист вью




Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 15 марта 2007 11:25
· Личное сообщение · #6

egorovshura пишет:
но думаю все таки что это не сработает

мне тож так кажется..
egorovshura пишет:
там скорее всего событие надо слать именно лист вью

По этому поводу не знаю.. Я даже придумать такого события не могу =)

-----
radio uno in ibisa ...




Ранг: 39.1 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 15 марта 2007 11:29
· Личное сообщение · #7

имхо у лист-айтемов нет хендлов. работа с ними осуществляется непосредственно через сам listview




Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 15 марта 2007 11:33 · Поправил: Icelot
· Личное сообщение · #8

Gelios пишет:
имхо у лист-айтемов нет хендлов

нету нету
Gelios пишет:
работа с ними осуществляется непосредственно через сам listview

А как именно?
Я думаю надо посылать сообщение WM_LBUTTONDOWN самому листу, но с определенными координатами..

-----
radio uno in ibisa ...





Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 15 марта 2007 12:02
· Личное сообщение · #9

вот:
BOOL ListView_GetItemPosition(

HWND hwnd,
int i,
POINT FAR *ppt
);
или смской:
LVM_GETITEMPOSITION
wParam = (WPARAM) (int) i;
lParam = (LPARAM) (POINT FAR *) ppt;

-----
radio uno in ibisa ...




Ранг: 122.2 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 15 марта 2007 12:16
· Личное сообщение · #10

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



Ранг: 29.2 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 15 марта 2007 12:23
· Личное сообщение · #11

скорее всего координаты надо мониторить, а вот еще дебильный вариант:
LRESULT SendMessage(

HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);


Parameters

hWnd

Identifies the window whose window procedure will receive the message. If this parameter is HWND_BROADCAST, the message is sent to All top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows; but the message is not sent to child windows.

;############################################




Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 15 марта 2007 12:55
· Личное сообщение · #12

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

это сложнее =) Если придумаешь напиши пожалуйста - хотелось бы глянуть..

-----
radio uno in ibisa ...




Ранг: 18.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 15 марта 2007 13:57
· Личное сообщение · #13

А что из себя итемы представляют?




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 15 марта 2007 14:09
· Личное сообщение · #14

egorovshura пишет:
видел прогу которая так делает. только вот посмотреть как именно она это делает дюже сложно


А ты натрави какой нибудь MS Spy++ на ту прогу или на сам листвьюв и посмотри что и куда шлётся...




Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 15 марта 2007 14:14
· Личное сообщение · #15

ToBad пишет:
А ты натрави какой нибудь MS Spy++ на ту прогу или на сам листвьюв и посмотри что и куда шлётся...

Или дай ссылку!

-----
radio uno in ibisa ...




Ранг: 122.2 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 15 марта 2007 15:03
· Личное сообщение · #16

ToBad
пробовал, но там лист вью очень часто обновляется куча второстепенной инфы - хрен найдешь. пытался сделать свое приложение с листвью, вроде начал на дельфе делать, но потом вспомнил, что дельфа стандартные win компоненты не пользует, а сама все рисует. начал на MFC делать, да так и не доделал. не дружу я с ним. плюнул и тут спросил



Ранг: 18.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 15 марта 2007 16:43
· Личное сообщение · #17

egorovshura
Действительно. Что за прога? Что такое эти итемы? если они в твоей программе не являются окнами (набор данных, которые самим SysListView32 просто отображаются) - как ты ИМ сообщения хочешь отправить?
Конкретнее.

Или - "Ссылку в студию!!"



Ранг: 88.0 (постоянный)
Активность: 0.070
Статус: Участник

Создано: 15 марта 2007 17:45
· Личное сообщение · #18

NMHDR nmhdr;
nmhdr.code = NM_CLICK;
SendMessage(hWndOfSysView, WM_NOTIFY, idCtrl, &nmhdr);




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 15 марта 2007 23:53
· Личное сообщение · #19

Icelot пишет:
Или дай ссылку!


Тут много всего, хотя самого MSSpy+ нету. Если нужен конкретно он, скинь своё мыло в личку.
h..p://www.wasm.ru/toollist.php?list=4



Ранг: 122.2 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 16 марта 2007 02:25
· Личное сообщение · #20

rep0A пишет:
NMHDR nmhdr;
nmhdr.code = NM_CLICK;
SendMessage(hWndOfSysView, WM_NOTIFY, idCtrl, &nmhdr);


Че то нифига не работает. А ты пробовал сам или просто предположение?



Ранг: 88.0 (постоянный)
Активность: 0.070
Статус: Участник

Создано: 16 марта 2007 18:05
· Личное сообщение · #21

egorovshura
предположение. а ты что в idCtrl указываешь? idCtrl не порядковый номмер итема (как узнать зная порядковый номмер не знаю -> msdn).



Ранг: 122.2 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 16 марта 2007 19:07
· Личное сообщение · #22

rep0A
idCtrl на самом деле ID ListView. Просто когда событие обрабатывается приложение может как я понял получить и WindowHandle и WIndowID. А номер итема в структуре передаваемой в качестве параметра события указывается



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 16 марта 2007 21:49
· Личное сообщение · #23

Ага, и этот номер (если нет свойства sort) - порядковый (начинаются, наверное, с 0, по аналогии с ListBox). Попробуй просто посчитать порядковый номер итема (либо посмотри в дебагере, какой у итема получается номер создания) и послать по этому номеру сначало ListView_SetItemState с параметром LV_ITEM->state=LVIS_SELECTED а потом WM_CHAR(enter)



Ранг: 88.0 (постоянный)
Активность: 0.070
Статус: Участник

Создано: 16 марта 2007 22:15
· Личное сообщение · #24

Специально сделал листбокс и посмотрел: во всех итемах idCtrl 190, чтото не очень похоже на номер, темболее порядковый.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 17 марта 2007 02:33
· Личное сообщение · #25

Меня эта тема тоже волнует ))) есть урок на Масме 9 там лист вью где при клике мессадж бокс вылетает ))) щас посмотрю сам ...я тож начал смотреть а тут на те ...уже тема есть

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 18 марта 2007 21:20 · Поправил: -=The Bone=-
· Личное сообщение · #26

To All
Из win32sdk:

The application fills in an LV_ITEM structure and adds a list view item by using the LVM_INSERTITEM message.
The LV_ITEM structure defines a list view item or subitem. The iItem member is the zero-based index of the item. The iSubItem member is the one-based index of a subitem or zero if the structure contains information about an item.
Что означает, rep0A, попробуй в цикл for заполнять LV_ITEM и делать LVM_INSERTITEM

Кстати, в примере в SDK делают именно так.

Т. е. надо ловить создание конкретного итема и запоминать его iItem, и уже от него плясать



Ранг: 88.0 (постоянный)
Активность: 0.070
Статус: Участник

Создано: 18 марта 2007 23:23
· Личное сообщение · #27

вот тоже почитал msdn и увидел одну интересную вещь:
For a list-view control, send structure NMITEMACTIVATE.

значит надо слать сообщение гдето так:

NMITEMACTIVATE nmia;
nmia.hdr.code = NM_CLICK;
nmia.iItem = iItem; //порядковый номер айтема
SendMessage(hWnd, WM_NOTIFY, idCtrl, &nmia);

-=The Bone=-
так и делал, но idCtrl != iItem.



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 19 марта 2007 10:34
· Личное сообщение · #28

WM_NOTIFY посылается самим listview родительскому окну, а не наоборот.

По сабжу:
сначала отправляем listview сообщение LVM_ENSUREVISIBLE, он проскроллит итемы так, чтобы нужный нам стал видимым.
Потом отправляем LVM_GETITEMRECT, чтобы получить границы конкретного итема.
После этого помещаем курсор над итемом (SetCursorPos) и отправляем listview сообщения WM_LBUTTONDOWN/WM_LBUTTONUP.



Ранг: 122.2 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 19 марта 2007 11:39
· Личное сообщение · #29

rmn
Вот это работает. Спасибки!

интересно, а с нотифайями вообще возможно что-то сделать




Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 19 марта 2007 13:00
· Личное сообщение · #30

rmn пишет:
После этого помещаем курсор над итемом (SetCursorPos) и отправляем listview сообщения WM_LBUTTONDOWN/WM_LBUTTONUP.

Зачем тревожить курсор, если можно WM_LBUTTONхххх с определенными координатами.

-----
radio uno in ibisa ...



 eXeL@B —› Программирование —› MouseClick на item в ListView
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати