Вкратце: Нужно считать текст из статусбара стороннего приложения, написанного на C++, которое вроде как не поддерживает COM. Ну и ваще управлять некоторыми его возможностями.
Это приложение запускаю с помощью класса Process т.е. знаю его хендл и PID. Чтобы открыть процесс надо использовать OpenProcess, а она выдаёт хендл не совпадающий с тем, что в объекте класса Process. GetLastError выдаёт 2 - не найден файл.
Что бы это могло значить? И как с этим бороться?
Для работы с апи сделал класс:
Dim API As New WAPI32.WinApi32
В нём объявлена
Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Boolean, ByVal dwProcessId As IntPtr) As Integer
Можно ли открыть процесс для записи/чтения в его память другими ср-вами (лучше если только ср-вами .нет), зная его PID & HWnd?
- Код: Выделить всё
Public ReadOnly Property RezMousPos() As String
Get
Dim rwb As Integer
Dim procid As Integer
Dim hProcess As Integer
Dim L As Integer
Dim prc As Integer ' указатель на выделенную память
Dim HWndStBrf As Integer
Dim s() As Byte
Dim API As New WAPI32.WinApi32
Dim C As WAPI32.ConstAPI32
Dim GCH As System.Runtime.InteropServices.GCHandle
HWndStBrf = Me.WinParBasic.HWnd
'GCH = System.Runtime.InteropServices.GCHandle.Alloc(procid)
API.GetWindowThreadProcessId(Me.WinParBasic.HWnd, procid) ' найти PID окна msctls_statusbar32
'GCH.Free()
hProcess = API.OpenProcess(C.PROCESS_ALL_ACCESS Or C.PROCESS_DUP_HANDLE, False, Me.GNAppParent.GNProcF.Id) ' получить хендл процесса
Debug.Print(System.Runtime.InteropServices.Marshal.GetLastWin32Error())
hProcess = Me.GNAppParent.GNProcF.Handle
L = API.SendMessage(HWndStBrf, C.SB_.SB_GETTEXTLENGTHA, 4, 0) ' длина строки первой панели // SendMessage(HWndStBrf, SB_GETTEXTLENGTHA, 1, 0) - вторая панель
If L = 0 Then L = 1
ReDim s(L - 1)
GCH = System.Runtime.InteropServices.GCHandle.Alloc(s)
prc = API.VirtualAllocEx(hProcess, 0, L, C.MEM_.MEM_COMMIT Or C.MEM_.MEM_TOP_DOWN, C.PAGE_READWRITE) 'выделить память
Debug.Print(System.Runtime.InteropServices.Marshal.GetLastWin32Error())
' Debug.Print "StatusBar prc - " & prc
API.SendMessage(HWndStBrf, C.SB_.SB_GETTEXTA, 4, prc) ' получить текст первой панели //SendMessage(HWndStBrf, SB_GETTEXTA, 1, prc) - вторая
API.ReadProcessMemory(hProcess, prc, GCH, L, rwb) 'прочитать из памяти
API.VirtualFreeEx(hProcess, prc, L, C.MEM_.MEM_RELEASE) 'освободить память
API.CloseHandle(hProcess)
GCH.Free()
Return ""
End Get
End Property
ЗЫ: Могли бы MS-ники в классе Process предусмотреть работу с памятью и проч., раз уж класс такой сделали, а то как то на недоделку смахивает.
Может есть где-нибудь уже в исходниках усовершенствованная версия?