Вобщем надо скопировать содержимое итема в буфер. кликаем по нему правой кнопкой мыши, и должно появится попап меню. но вот только как задать чтоб отслеживался клик? WM_RBUTTONDOWN не доходят до ListView.
OFFSIDE канеша искал, нашёл но и только. у меня задачка списать интерфейс пассворд про,.. там вот, нажимая правой кнопкой мыши на итеме (хеш полученный), выскакивает попап - жмёш получаеш хеш в clipboard. мой код: Код (Text): 1 .elseif eax == WM_NOTIFY 2 mov ebx, lParam 3 assume ebx:ptr NMHDR 4 mov eax,[ebx].hwndFrom 5 .if eax == g_hwndReportListView 6 mov eax,[ebx].code 7 .if eax==LVN_ITEMCHANGED;NM_RCLICK;LVN_ITEMCHANGED ;WM_RBUTTONDOWN 8 mov ebx, lParam 9 assume ebx: ptr NMLISTVIEW 10 .if [ebx].uNewState == 3 11 invoke GetCursorPos,addr pt 12 invoke SetForegroundWindow,hDlg 13 invoke TrackPopupMenu,hPopupMenu,TPM_LEFTALIGN or TPM_LEFTBUTTON,pt.x,pt.y,NULL,hDlg,NULL 14 invoke PostMessage,hDlg,WM_NULL,0,0 15 .endif 16 .endif 17 .endif .else Вобщем в строке 7: если LVN_ITEMCHANGED, то отслеживает изменеие итема вообще (лев,прав клики). если NM_RCLICK, то правый клик где угодно, то есть уже неотслеживает на ком кликнули Так вот как это обЪеденить?
Для каждого NMHDR.code своя обработка, и все передаваемые через lParam структуры организованы так, что первым идет NMHDR, а последующая часть зависит от NMHDR.code. Соответственно, для разных кодов приходят разные структуры, в частности при NM_RCLICK приходит NMITEMACTIVATE, из которого можно получить, на каком итеме был клик (или индекс итема, или -1, если в пустом месте). Надо просто сделать нужный assume ebx, в твоём случае после assume ebx:ptr NMHDR и опеределения, что код = NM_RCLICK, нужно сделать assume ebx:ptr NMITEMACTIVATE и смотреть в [ebx].iItem Или вот альтернативная форма записи (без assume): Код (Text): mov ebx, lParam .if [ebx.NMHDR].code==NM_RCLICK lea esi,[ebx.NMITEMACTIVATE] PrintDec [esi.NMITEMACTIVATE].iItem .if [esi.NMITEMACTIVATE].iItem != -1 invoke ShowLVPopup, [esi.NMITEMACTIVATE].iItem .endif .endif Правда с такой формой записи нужно помнить все члены структуры, т.к. Radasm не показывает всплывающих подсказок с именами членов структуры.
хм... а что это за ф. ShowLVPopup? У меня синтакс масм спасибо, работает! Ну вот попап вылез, теперь надо взять содержимое итема и поместить в буфер это как? Тоесть как получить доступ к колонке. если так Код (Text): ListView_GetItemText g_hwndReportListView, LV_iItem, 0, addr LV_Buf, sizeof LV_Buf то получаем именно название итема: /1/ колонка1 колонка2 /1/ ТЕКСТ1 2 ТЕКСТ2 3 ТЕКСТ3 а как получить ТЕКСТ1 ?
Это код из моей проги, там тоже показывается попап меню по правому клику. Содержимое итема можно взять, послав листу сообщение LVM_GETITEM с заполненой структурой LVITEM. В структуре указать флаг LVIF_TEXT, номер итема, номер субитема , адрес приёмного буфера и размер приёмного буфера. Чтобы поместить полученый текст в clipboard юзай OpenClipboard/SetClipboardData/CloseClipboard
У тебя третий параметр ListView_GetItemText установлен в ноль, поэтому получаешь текст первой колонки. Установи в 1 - будет текст второй колонки. Или используй такую функцию: Код (Text): lv_GetItemText proc hLV:DWORD, iItem:DWORD, iSubItem:DWORD, lpOut:DWORD, cbOut:DWORD LOCAL lvi :LVITEM mov lvi.imask, LVIF_TEXT mov eax,lpOut mov lvi.pszText, eax mov eax, cbOut mov lvi.cchTextMax, eax mov eax,iItem mov lvi.iItem, eax mov eax,iSubItem mov lvi.iSubItem, eax invoke SendMessage, hLV, LVM_GETITEM, iItem, addr lvi ret lv_GetItemText endp hLV - хэндл листвью, iItem - номер итема, iSubItem - номер колонки (0-первая колонка, 1-вторая, 2-третья и т.д.), lpOut -адрес буфера, куда будет получен текст, cbOut - размер этого буфера.
Да, с iSubItme запорол. я вот хотел зайти и отредактировать месседж. не, я просто после NM_RCLICK забил iItem и iSubItem в переменные, а потом при обработке комманд получил текст iSubItema// спасиба cresta за напутствия... ЗЫ: удобная функция
Кстати, .data String0 db "TEXT",0 .data? String1 db 4 dup (?) .code ;чем отличается: invoke MessageBox,0, addr String0, 0, 0 ;от invoke MessageBox,0, offset String0, 0, 0 ;и invoke MessageBox,0, addr String1, 0, 0 ;от invoke MessageBox,0, offset String1, 0, 0 ?