97 lines
3.8 KiB
VB.net
97 lines
3.8 KiB
VB.net
Imports System.Text
|
|
Imports System.ComponentModel
|
|
|
|
Public Class Utils
|
|
Private Shared GetControlNameMessage As Integer = 0
|
|
|
|
Public Shared Function GetWinFormsId(ByVal hWnd As IntPtr) As String
|
|
GetControlNameMessage = NativeMethods.RegisterWindowMessage("WM_GETCONTROLNAME")
|
|
Return XProcGetControlName(hWnd, GetControlNameMessage)
|
|
End Function
|
|
|
|
Protected Shared Function XProcGetControlName(ByVal hwnd As IntPtr, ByVal msg As Integer) As String
|
|
Dim bytearray As Byte() = New Byte(65535) {}
|
|
Dim bufferMem As IntPtr = IntPtr.Zero
|
|
Dim written As IntPtr = IntPtr.Zero
|
|
Dim retHandle As IntPtr = IntPtr.Zero
|
|
Dim retVal As Boolean
|
|
Dim processHandle As IntPtr = IntPtr.Zero
|
|
Dim fileHandle As IntPtr = IntPtr.Zero
|
|
|
|
If Not (Environment.OSVersion.Platform = PlatformID.Win32Windows) Then
|
|
|
|
Try
|
|
Dim size As UInteger
|
|
size = 65536
|
|
processHandle = NativeMethods.OpenProcess(NativeMethods.PROCESS_VM_OPERATION Or NativeMethods.PROCESS_VM_READ Or NativeMethods.PROCESS_VM_WRITE, False, GetProcessIdFromHWnd(hwnd))
|
|
|
|
If processHandle.ToInt64() = 0 Then
|
|
Throw New Win32Exception()
|
|
End If
|
|
|
|
bufferMem = NativeMethods.VirtualAllocEx(processHandle, IntPtr.Zero, New UIntPtr(size), NativeMethods.MEM_RESERVE Or NativeMethods.MEM_COMMIT, NativeMethods.PageProtection.ReadWrite)
|
|
|
|
If bufferMem.ToInt64() = 0 Then
|
|
Throw New Win32Exception()
|
|
End If
|
|
|
|
retHandle = NativeMethods.SendMessage(hwnd, msg, New IntPtr(size), bufferMem)
|
|
retVal = NativeMethods.ReadProcessMemory(processHandle, bufferMem, bytearray, New UIntPtr(size), written)
|
|
|
|
If Not retVal Then
|
|
Throw New Win32Exception()
|
|
End If
|
|
|
|
Finally
|
|
retVal = NativeMethods.VirtualFreeEx(processHandle, bufferMem, New UIntPtr(0), NativeMethods.MEM_RELEASE)
|
|
|
|
If Not retVal Then
|
|
Throw New Win32Exception()
|
|
End If
|
|
|
|
NativeMethods.CloseHandle(processHandle)
|
|
End Try
|
|
Else
|
|
|
|
Try
|
|
Dim size2 As Integer
|
|
size2 = 65536
|
|
fileHandle = NativeMethods.CreateFileMapping(New IntPtr(NativeMethods.INVALID_HANDLE_VALUE), IntPtr.Zero, NativeMethods.PageProtection.ReadWrite, 0, size2, Nothing)
|
|
|
|
If fileHandle.ToInt64() = 0 Then
|
|
Throw New Win32Exception()
|
|
End If
|
|
|
|
bufferMem = NativeMethods.MapViewOfFile(fileHandle, NativeMethods.FILE_MAP_ALL_ACCESS, 0, 0, New UIntPtr(0))
|
|
|
|
If bufferMem.ToInt64() = 0 Then
|
|
Throw New Win32Exception()
|
|
End If
|
|
|
|
NativeMethods.MoveMemoryFromByte(bufferMem, bytearray(0), size2)
|
|
retHandle = NativeMethods.SendMessage(hwnd, msg, New IntPtr(size2), bufferMem)
|
|
NativeMethods.MoveMemoryToByte(bytearray(0), bufferMem, 1024)
|
|
Finally
|
|
NativeMethods.UnmapViewOfFile(bufferMem)
|
|
NativeMethods.CloseHandle(fileHandle)
|
|
End Try
|
|
End If
|
|
|
|
Return ByteArrayToString(bytearray)
|
|
End Function
|
|
|
|
Private Shared Function GetProcessIdFromHWnd(ByVal hwnd As IntPtr) As UInteger
|
|
Dim pid As UInteger
|
|
NativeMethods.GetWindowThreadProcessId(hwnd, pid)
|
|
Return pid
|
|
End Function
|
|
|
|
Private Shared Function ByteArrayToString(ByVal bytes As Byte()) As String
|
|
If Environment.OSVersion.Platform = PlatformID.Win32Windows Then
|
|
Return Encoding.[Default].GetString(bytes).TrimEnd(vbNullChar)
|
|
Else
|
|
Return Encoding.Unicode.GetString(bytes).TrimEnd(vbNullChar)
|
|
End If
|
|
End Function
|
|
End Class
|