Возникла производственная необходимость получить список всех элементов ListView в чужом процессе. Вкратце... есть сервер, на нем программа управления со списком ListView всех подключенных клиентов, то бишь студентов и преподавателей. Мне нужно получить данные этого списка и выделить только студентов. Показать список только студентов в своем окне и все! Больше ничего не нужно. Прежде, чем обратиться сюда долго пытался сделать это сам, но ничего не получилось, кроме, как получить просто количество элементов... но это почти ничего... (((
- Код: Выделить всё
Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "User32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As Any) As Long
Private Const LVM_FIRST = &H1000
Private Const LVM_GETITEMCOUNT = (LVM_FIRST + 4)
Private Const LVM_GETITEMTEXT = (LVM_FIRST + 45)
Private Sub Form_Load()
Dim hHost As Long
Dim hPanel As Long
Dim hPanel2 As Long
Dim hListView As Long
Dim lCount As Long
'Находим наш ListView на главной форме сервера...
hHost = FindWindow("TF_Main", vbNullString)
hPanel = FindWindowEx(hHost, ByVal 0&, "TPanel", vbNullString)
hPanel2 = FindWindowEx(hHost, hPanel, "TPanel", vbNullString)
hListView = FindWindowEx(hPanel2, ByVal 0&, "TListView", vbNullString)
'Количество элементов списка...
lCount = SendMessage(hListView, LVM_GETITEMCOUNT, 0&, 0&)
MsgBox lCount
End Sub
...а дальше начинаются выкрутасы с памятью чужого процесса, но я в этом не силен. Искал примеры здесь...
http://bbs.vbstreets.ru/viewtopic.php?f=1&t=35356
https://forum.sources.ru/index.php?showtopic=314667
но проблема не решена... а здесь...
http://bbs.vbstreets.ru/viewtopic.php?p=6712105#p6712105
у автора GDK все получилось, но листинг он так и не выложил. ((( Писать автору топика не решился в силу давности публикации за февраль 2009 года. Наверное никто уже и не ответит мне. (((
Нашел пример на С вот здесь...
https://www.codeproject.com/Articles/5570/Stealing-Program-s-Memory
Автор статьи анализирует неправильный код и в конце пишет, что все исправил и все получилось...
(цитата)
«Yay, all done. In case that didn't make too much sense to you, here is our new code, all fixed up.»
«Ура, все готово. В случае, если это не имеет для вас особого смысла, вот наш новый код, все исправлено.»
Но я не знаю С и не могу перевести этот код на бейсик. Просьба помочь, очень нужно для работы.
Пробовал и такие варианты...
- Код: Выделить всё
Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "User32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As Any) As Long
Private Const LVM_FIRST = &H1000
Private Const LVM_GETITEMCOUNT = (LVM_FIRST + 4)
Private Const LVM_GETITEMTEXT = (LVM_FIRST + 45)
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 Declare Function GetWindowThreadProcessId Lib "User32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Const PROCESS_VM_OPERATION = &H8
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_VM_WRITE = &H20
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Declare Function VirtualAllocEx Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpAddress As Any, ByRef dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Const MEM_COMMIT = &H1000
Private Const PAGE_READWRITE = &H4
Private Declare Function VirtualFreeEx Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpAddress As Any, ByRef dwSize As Long, ByVal dwFreeType As Long) As Long
Private Const MEM_RELEASE = &H8000
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal Handle As Long) As Long
Private Sub Form_Load()
Dim hHost As Long
Dim hPanel As Long
Dim hPanel2 As Long
Dim hListView As Long
Dim lCount As Long
'Находим наш ListView на главной форме сервера...
hHost = FindWindow("TF_Main", vbNullString)
hPanel = FindWindowEx(hHost, ByVal 0&, "TPanel", vbNullString)
hPanel2 = FindWindowEx(hHost, hPanel, "TPanel", vbNullString)
hListView = FindWindowEx(hPanel2, ByVal 0&, "TListView", vbNullString)
'Количество элементов списка...
lCount = SendMessage(hListView, LVM_GETITEMCOUNT, 0&, 0&)
MsgBox lCount
Dim PID As Long
Dim hProcess As Long
Dim LVTextBufferAddr As Long
GetWindowThreadProcessId hListView, PID
hProcess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or _
PROCESS_VM_WRITE Or PROCESS_QUERY_INFORMATION, False, PID)
LVTextBufferAddr = VirtualAllocEx(hProcess, ByVal 0&, ByVal 512&, MEM_COMMIT, PAGE_READWRITE)
Dim uLVI As LVITEM
Dim a(512) As Byte
Dim lLen As Long
With uLVI
.mask = LVIF_TEXT
.iItem = 1
.iSubItem = 1
.pszText = LVTextBufferAddr
.cchTextMax = 512
End With
lLen = SendMessage(hListView, LVM_GETITEMTEXT, 1, VarPtr(uLVI))
ItemText = Left$(StrConv(a(), vbUnicode), lLen)
MsgBox ItemText
VirtualFreeEx hProcess, LVTextBufferAddr, 0&, MEM_RELEASE
CloseHandle hProcess
End Sub
Но глухо, пока ничего... (((