سلام دوستان
ميخوام با استفاده از API با list view ارتباط برقرار كنم
يعني اينكه بين آيتمهاش موضوع خودم رو جستجو كنم و آيتمي رو كه ميخوام select كنم
با LVM_GETITEMCOUNT تونستم تعداد آيتمهاي موجود در list view رو بگيرم
حالا براي اون دوتاي بالايي نميدونم ولي فكر كنم LVM_GETITEMTEXT كار كنه
اما مشكل من فرستادن يك نوع جديد به صورت زير هست
کد:
Private Type LVITEM
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As String
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long
End Type
كدومهاش رو بايد مقدار دهي كنم
طرز كارشون چي جوري هست
ممنون !
کد:
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const LVM_FIRST = &H1000 ' ListView messages
Public Const LVM_GETITEMCOUNT = (LVM_FIRST + 4)
Public Const LVM_GETITEMTEXTA = (LVM_FIRST + 45) 'unicode
Public Const LVM_GETITEMTEXTW = (LVM_FIRST + 115)
Public Type LVITEM
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As Long 'String
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long 'for IE>3
End Type
Function GetListViewText(ByVal hwnd As Long, ByVal ItemIndex As Long) As String
' Obtain the name of the specified Item of the list view
'On Error Resume Next
Dim objItem As LVITEM
Dim baBuffer(320) As Byte, N As Long
With objItem
.mask = LVIF_TEXT
.iSubItem = 0
.pszText = VarPtr(baBuffer(0))
.cchTextMax = UBound(baBuffer) - 1
End With
N = SendMessage(hwnd, LVM_GETITEMTEXTA, ItemIndex - 1, objItem) ' ItemIndex-1 is because of list is zero-based index
GetListViewText = Left$(StrConv(baBuffer, vbUnicode), N) 'convert from binary byte array to a String
End Function
Function GetListViewCount(ByVal hwnd As Long) As Long
'this simply get number of items
GetListViewCount = SendMessage(hwnd, LVM_GETITEMCOUNT, 0&, ByVal 0&)
End Function
کد:
Private Sub Command1_Click()
'With ListView1
'.View = lvwReport
'.ColumnHeaders.Add Text:="Name"
'.ListItems.Add Text:="John"
'.ListItems.Add Text:="Kharazmi"
'.ListItems.Add Text:="ABCD"
'.Refresh
'End With
Label1.Caption = "N = " & GetListViewCount(ListView1.hwnd)
Label2.Caption = "Item 1 = " & GetListViewText(ListView1.hwnd, 1)
Label3.Caption = "Item 3 = " & GetListViewText(ListView1.hwnd, 3)
End Sub
برای من وقتی هندل ليست ويو صفحه ديگه رو ميزارم اون برنامه ارور dont send ميخوره دليلش رو نميدونم.
خيلي ممنون عالي بود اما ...
با ليست ويو تو برنامه خودم كار ميكنه ولي برنامه هاي ديگه مثل explorer خطا ميده و explorer رو ريست ميكنه
دوستان و اساتيد كسي مي تونه اين مشكل رو حل كنه ؟!
شايد كدي كه هندل اكسپلورر رو مي گيره مشكل داشته باشه
مي توني كدشو بذاري؟
اين هم كدي كه هم هندل اكسپلورر و در نهايت هندل list view رو به من ميده
با تابع lvm_getitemcount كار كرد ، اما با اين يكي مشكل داره
کد:
Dim hwnd As Long
Shell "explorer C:\", vbMaximizedFocus
A& = GetForegroundWindow
hwnd = FindWindowEx(A&, 0, "SHELLDLL_DefView", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "DUIViewWndClassName", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "DirectUIHWND", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "CtrlNotifySink", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "SysListView32", "FolderView")
'handel list view = hwnd