Посл.ответ |
Сообщение |
Ранг: 122.2 (ветеран) Активность: 0.04↘0 Статус: Участник
|
Создано: 15 марта 2007 01:08 · Личное сообщение · #1
есть контрол SysListView32. как послать месседж MouseClick айтему с определенным индексом в этом контролле? можно не по индексу, но главное чтобы послать месседж конкретному айтему.
другими словами как эмулировать клик мышкой по айтему в лист вью?
| Сообщение посчитали полезным: |
|
Ранг: 85.4 (постоянный) Активность: 0.08↘0 Статус: Участник
|
Создано: 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.04↘0 Статус: Участник
|
Создано: 15 марта 2007 10:47 · Личное сообщение · #3
точно не в своем хочу. в том то и проблема, что непонятно как получить хендл итема. хендл лист вью - пожалуйста, а хендл итема не знаю как. да и твой вариант не сработает, если итем будет находиться вне видимости, то есть нужно сначала проскроллить. но я точно заню, что можно послать событие именно определенному итему. видел прогу которая так делает. только вот посмотреть как именно она это делает дюже сложно
| Сообщение посчитали полезным: |
Ранг: 85.4 (постоянный) Активность: 0.08↘0 Статус: Участник
|
Создано: 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.04↘0 Статус: Участник
|
Создано: 15 марта 2007 11:11 · Личное сообщение · #5
я так понимаю что итем в листе не является окном. сейчас проверить просто не могу этот код. дома вечерком посмотрю, но думаю все таки что это не сработает, там скорее всего событие надо слать именно лист вью
| Сообщение посчитали полезным: |
Ранг: 85.4 (постоянный) Активность: 0.08↘0 Статус: Участник
|
Создано: 15 марта 2007 11:25 · Личное сообщение · #6
egorovshura пишет:
но думаю все таки что это не сработает
мне тож так кажется..
egorovshura пишет:
там скорее всего событие надо слать именно лист вью
По этому поводу не знаю.. Я даже придумать такого события не могу =)
----- radio uno in ibisa ... | Сообщение посчитали полезным: |
Ранг: 39.1 (посетитель) Активность: 0.03↘0 Статус: Участник
|
Создано: 15 марта 2007 11:29 · Личное сообщение · #7
имхо у лист-айтемов нет хендлов. работа с ними осуществляется непосредственно через сам listview
| Сообщение посчитали полезным: |
Ранг: 85.4 (постоянный) Активность: 0.08↘0 Статус: Участник
|
Создано: 15 марта 2007 11:33 · Поправил: Icelot · Личное сообщение · #8
Gelios пишет:
имхо у лист-айтемов нет хендлов
нету нету
Gelios пишет:
работа с ними осуществляется непосредственно через сам listview
А как именно?
Я думаю надо посылать сообщение WM_LBUTTONDOWN самому листу, но с определенными координатами..
----- radio uno in ibisa ... | Сообщение посчитали полезным: |
Ранг: 85.4 (постоянный) Активность: 0.08↘0 Статус: Участник
|
Создано: 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.04↘0 Статус: Участник
|
Создано: 15 марта 2007 12:16 · Личное сообщение · #10
Icelot
не получится, если нужно проскролить, для того чтобы итем оказался в видимой обласи
| Сообщение посчитали полезным: |
Ранг: 29.2 (посетитель) Активность: 0.01↘0 Статус: Участник
|
Создано: 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.08↘0 Статус: Участник
|
Создано: 15 марта 2007 12:55 · Личное сообщение · #12
egorovshura пишет:
не получится, если нужно проскролить, для того чтобы итем оказался в видимой обласи
это сложнее =) Если придумаешь напиши пожалуйста - хотелось бы глянуть..
----- radio uno in ibisa ... | Сообщение посчитали полезным: |
Ранг: 18.4 (новичок) Активность: 0.02↘0 Статус: Участник
|
Создано: 15 марта 2007 13:57 · Личное сообщение · #13
А что из себя итемы представляют?
| Сообщение посчитали полезным: |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 15 марта 2007 14:09 · Личное сообщение · #14
egorovshura пишет:
видел прогу которая так делает. только вот посмотреть как именно она это делает дюже сложно
А ты натрави какой нибудь MS Spy++ на ту прогу или на сам листвьюв и посмотри что и куда шлётся...
| Сообщение посчитали полезным: |
Ранг: 85.4 (постоянный) Активность: 0.08↘0 Статус: Участник
|
Создано: 15 марта 2007 14:14 · Личное сообщение · #15
ToBad пишет:
А ты натрави какой нибудь MS Spy++ на ту прогу или на сам листвьюв и посмотри что и куда шлётся...
Или дай ссылку!
----- radio uno in ibisa ... | Сообщение посчитали полезным: |
Ранг: 122.2 (ветеран) Активность: 0.04↘0 Статус: Участник
|
Создано: 15 марта 2007 15:03 · Личное сообщение · #16
ToBad
пробовал, но там лист вью очень часто обновляется куча второстепенной инфы - хрен найдешь. пытался сделать свое приложение с листвью, вроде начал на дельфе делать, но потом вспомнил, что дельфа стандартные win компоненты не пользует, а сама все рисует. начал на MFC делать, да так и не доделал. не дружу я с ним. плюнул и тут спросил
| Сообщение посчитали полезным: |
Ранг: 18.4 (новичок) Активность: 0.02↘0 Статус: Участник
|
Создано: 15 марта 2007 16:43 · Личное сообщение · #17
egorovshura
Действительно. Что за прога? Что такое эти итемы? если они в твоей программе не являются окнами (набор данных, которые самим SysListView32 просто отображаются) - как ты ИМ сообщения хочешь отправить?
Конкретнее.
Или - "Ссылку в студию!!"
| Сообщение посчитали полезным: |
Ранг: 88.0 (постоянный) Активность: 0.07↘0 Статус: Участник
|
Создано: 15 марта 2007 17:45 · Личное сообщение · #18
NMHDR nmhdr;
nmhdr.code = NM_CLICK;
SendMessage(hWndOfSysView, WM_NOTIFY, idCtrl, &nmhdr);
| Сообщение посчитали полезным: |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 15 марта 2007 23:53 · Личное сообщение · #19
Icelot пишет:
Или дай ссылку!
Тут много всего, хотя самого MSSpy+ нету. Если нужен конкретно он, скинь своё мыло в личку.
h..p://www.wasm.ru/toollist.php?list=4
| Сообщение посчитали полезным: |
Ранг: 122.2 (ветеран) Активность: 0.04↘0 Статус: Участник
|
Создано: 16 марта 2007 02:25 · Личное сообщение · #20
rep0A пишет:
NMHDR nmhdr;
nmhdr.code = NM_CLICK;
SendMessage(hWndOfSysView, WM_NOTIFY, idCtrl, &nmhdr);
Че то нифига не работает. А ты пробовал сам или просто предположение?
| Сообщение посчитали полезным: |
Ранг: 88.0 (постоянный) Активность: 0.07↘0 Статус: Участник
|
Создано: 16 марта 2007 18:05 · Личное сообщение · #21
egorovshura
предположение. а ты что в idCtrl указываешь? idCtrl не порядковый номмер итема (как узнать зная порядковый номмер не знаю -> msdn).
| Сообщение посчитали полезным: |
Ранг: 122.2 (ветеран) Активность: 0.04↘0 Статус: Участник
|
Создано: 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.07↘0 Статус: Участник
|
Создано: 16 марта 2007 22:15 · Личное сообщение · #24
Специально сделал листбокс и посмотрел: во всех итемах idCtrl 190, чтото не очень похоже на номер, темболее порядковый.
| Сообщение посчитали полезным: |
Ранг: 673.3 (! !), 400thx Активность: 0.4↘0.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.07↘0 Статус: Участник
|
Создано: 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.14↗0.49 Статус: Участник
|
Создано: 19 марта 2007 10:34 · Личное сообщение · #28
WM_NOTIFY посылается самим listview родительскому окну, а не наоборот.
По сабжу:
сначала отправляем listview сообщение LVM_ENSUREVISIBLE, он проскроллит итемы так, чтобы нужный нам стал видимым.
Потом отправляем LVM_GETITEMRECT, чтобы получить границы конкретного итема.
После этого помещаем курсор над итемом (SetCursorPos) и отправляем listview сообщения WM_LBUTTONDOWN/WM_LBUTTONUP.
| Сообщение посчитали полезным: |
Ранг: 122.2 (ветеран) Активность: 0.04↘0 Статус: Участник
|
Создано: 19 марта 2007 11:39 · Личное сообщение · #29
rmn
Вот это работает. Спасибки!
интересно, а с нотифайями вообще возможно что-то сделать
| Сообщение посчитали полезным: |
Ранг: 85.4 (постоянный) Активность: 0.08↘0 Статус: Участник
|
Создано: 19 марта 2007 13:00 · Личное сообщение · #30
rmn пишет:
После этого помещаем курсор над итемом (SetCursorPos) и отправляем listview сообщения WM_LBUTTONDOWN/WM_LBUTTONUP.
Зачем тревожить курсор, если можно WM_LBUTTONхххх с определенными координатами.
----- radio uno in ibisa ... | Сообщение посчитали полезным: |