我寫的是vb,用的遠程行程訪問,所以到貴寶地尋求答案,謝謝。
代碼能夠獲取SysListView32里面的內容,卻無法獲得listctrl內容,困惑啊
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const MEM_RELEASE = &H8000
Private Const LVM_FIRST = &H1000
Private Const LVM_GETITEMCOUNT = (LVM_FIRST + 4)
Private Const LVM_GETITEM = (LVM_FIRST + 5)
Private Const LVM_GETSTRINGWIDTH = (LVM_FIRST + 17)
Private Const LVM_GETCOLUMN = (LVM_FIRST + 25)
Private Const LVM_GETITEMTEXT = (LVM_FIRST + 45)
Private Const PROCESS_QUERY_INFORMATION = 1024
Private Const PROCESS_VM_OPERATION = &H8
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_VM_WRITE = &H20
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const MAX_LVMSTRING As Long = 255
Private Const MEM_COMMIT = &H1000
Private Const PAGE_READWRITE = &H4
Private Const LVIF_TEXT As Long = &H1
Private Type LVITEM
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As Long
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long
End Type
Private Function GetListviewItem(ByVal hWindow As Long, ByVal pRow As Long, ByVal pColumn As Long) As String
Dim myItem As LVITEM
Dim PID As Long
Dim pHandle As Long
Dim pStrBufferMemory As Long
Dim pMyItemMemory As Long
Dim strBuffer() As Byte
Dim index As Long
Dim tmpString As String
Dim strLength As Long
'**********************
'init the string buffer
'**********************
ReDim strBuffer(MAX_LVMSTRING)
'***********************************************************
'open a handle to the process and allocate the string buffer
'***********************************************************
GetWindowThreadProcessId hWindow, PID
pHandle = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, PID)
pStrBufferMemory = VirtualAllocEx(pHandle, 0, MAX_LVMSTRING, MEM_COMMIT, PAGE_READWRITE)
'************************************************************************************
'initialize the local LV_ITEM structure
'The myItem.iSubItem member is set to the index of the column that is being retrieved
'************************************************************************************
myItem.mask = LVIF_TEXT
myItem.iSubItem = pColumn
myItem.pszText = pStrBufferMemory
myItem.cchTextMax = MAX_LVMSTRING
'**********************************************************
'write the structure into the remote process's memory space
'**********************************************************
pMyItemMemory = VirtualAllocEx(pHandle, 0, Len(myItem), MEM_COMMIT, PAGE_READWRITE)
Call WriteProcessMemory(pHandle, pMyItemMemory, myItem, Len(myItem), 0)
'*************************************************************
'send the get the item message and write back the memory space
'*************************************************************
Call SendMessage(hWindow, LVM_GETITEMTEXT, pRow, ByVal pMyItemMemory)
Call ReadProcessMemory(pHandle, pStrBufferMemory, strBuffer(0), MAX_LVMSTRING, 0)
MsgBox strBuffer(0)
'**************************************************
'turn the byte array into a string and send it back
'**************************************************
For index = 0 To UBound(strBuffer)
If Chr(strBuffer(index)) = vbNullChar Then Exit For
tmpString = tmpString & Chr(strBuffer(index))
Next index
'**************************************************
'deallocate the memory and close the process handle
'**************************************************
Call CloseHandle(hWindow)
Call CloseHandle(pHandle)
Call VirtualFreeEx(pHandle, pStrBufferMemory, 0, MEM_RELEASE)
Call VirtualFreeEx(pHandle, pMyItemMemory, 0, MEM_RELEASE)
If Len(tmpString) > 0 Then GetListviewItem = tmpString
End Function
Private Sub Command1_Click()
MsgBox GetListviewItem(&HB082A, 0, 0)
End Sub
uj5u.com熱心網友回復:
listctrl?用GetWindowText試試?
uj5u.com熱心網友回復:
人家都說是VB了。uj5u.com熱心網友回復:
發錯版塊了吧?樓主考驗VC區的童鞋的VB能力呀。
SendMessage(hWindow, LVM_GETITEMTEXT, pRow, ByVal pMyItemMemory)
斷點到這句看看內容進來了沒有。
uj5u.com熱心網友回復:
你hook了什么程式?uj5u.com熱心網友回復:
能夠獲取SysListView32里面的內容,卻無法獲得listctrl內容--------------------------------
Call SendMessage(hWindow, LVM_GETITEMTEXT, pRow, ByVal pMyItemMemory)
要獲取listctrl的內容,發送的訊息是LVM_GETITEMTEXT沒錯么?
uj5u.com熱心網友回復:
hWindow 不對。要找到listctrl的hwnd
uj5u.com熱心網友回復:
發錯版面了,樓主進錯了論壇uj5u.com熱心網友回復:
發錯了uj5u.com熱心網友回復:
首先謝謝各位回帖,因為用的是遠程訪問,所以我覺得此等難度適合去VC區提問,這在我帖子一開頭就說明了。我百度了一下,好像SysListView32和listctrl用的資料結構和訊息都是一樣的,怎么只SysListView32行,而listctrl不行,沒有道理啊。
我在做的是一個期貨交易軟體的后臺分析程式,卡在這里做不下去,希望各位兄臺能幫忙解決,我一定另外奉上100分。
我用中文把關鍵部分每一段代碼重新標明,以便閱讀
***********找到listctrl視窗所在行程識別符號
GetWindowThreadProcessId hWindow, PID
***********獲得行程句柄
pHandle = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, PID)
***********申請記憶體,獲得指定行 文字內容的指標
pStrBufferMemory = VirtualAllocEx(pHandle, 0, MAX_LVMSTRING, MEM_COMMIT, PAGE_READWRITE)
×××××××××××myitem是lvitem資料結構
myItem.mask = LVIF_TEXT
myItem.iSubItem = pColumn
myItem.pszText = pStrBufferMemory
myItem.cchTextMax = MAX_LVMSTRING
×××××××××××獲得指定行的指標 (上一個是指定行 文字內容指標,區別哦)
pMyItemMemory = VirtualAllocEx(pHandle, 0, Len(myItem), MEM_COMMIT, PAGE_READWRITE)
×××××××××××把myitem寫入記憶體
Call WriteProcessMemory(pHandle, pMyItemMemory, myItem, Len(myItem), 0)
×××××××××××把指定行讀取到該記憶體
Call SendMessage(hWindow, LVM_GETITEMTEXT, pRow, ByVal pMyItemMemory)
×××××××××××讀取指定行的文字內容到strBuffer
Call ReadProcessMemory(pHandle, pStrBufferMemory, strBuffer(0), MAX_LVMSTRING, 0)
這個時候,如果是SysListView32,strBuffer(0)就有內容進來了,而listctrl就現實沒有。
uj5u.com熱心網友回復:
我嘗試用spy4win,syslistview32都可以取到文本內容,就我這個listctrl取不到內容,我懷疑期貨軟體到該控制元件做了特別處理。uj5u.com熱心網友回復:
暈倒,spy4win也取不到該內容,取SysListView32倒是可以的,懷疑期貨軟體該控制元件特殊處理了。uj5u.com熱心網友回復:
"SysListView32和listctrl"一個是view,他有個成員是listctrl,本身不是listctrl。
即要GetListCtrl。
uj5u.com熱心網友回復:
我也遇到了類似的問題,請問樓主后來解決了嗎?轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/106529.html
標籤:API
