ايران ويج

نسخه‌ی کامل: ارتباط با list view از طريق API
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام دوستان
ميخوام با استفاده از 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