您现在的位置: 爱51代码网 >> 范文 >> 文章正文
vb如何通过句柄获取外部程序的窗口的内容

Imports System.Runtime.InteropServices
Imports System
Imports System.IO
Imports System.Text
Imports System.Math
Public Class Form1
    Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Public Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
    Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal ByValhWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
    Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Integer) As Integer
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Integer, ByVal wCmd As Integer) As Integer
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
    Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Integer, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer
    Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    Private Const GW_CHILD = 5
    Private Const GW_HWNDNEXT = 2
    Private Const WM_GETTEXT As Integer = &HD
    Private Const LB_GETCOUNT = &H18B
    Private Const WM_close = 16
    Private Const EM_GETLINECOUNT As Integer = (&H1000 + 4)
    Public Function GetHandle() As Long
        Dim hwnd As Long
        Dim hChild As Long
        Dim Handle As IntPtr = Marshal.AllocHGlobal(104)
        hwnd = FindWindow(vbNullString, "刀具路径列表")
        hChild = FindWindowEx(hwnd, 0, "SysListView32", vbNullString)
        SendMessage(hChild, WM_GETTEXT, 50, Handle)
        Dim Text As String = Marshal.PtrToStringUni(Handle) '获取内容,只有一个list1
        MsgBox(Text)
        Dim intCount As Integer = SendMessage(hChild, EM_GETLINECOUNT, 0, 0) '获取行数,成功
        MsgBox(intCount)
        Dim RetVal As Long = SendMessage(hwnd, WM_close, 0&, 0&) '关闭窗口,成功
    End Function
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        GetHandle()
    End Sub
End Class

上面的程序已经可以获取到窗口内容的行数,但无法获取到里面具体的内容,请高手帮忙看看哪里错了

Public Class Form1
    'Constants
    Private Const LVFI_PARAM = 1
    Private Const LVM_FIRST = &H1000
    Private Const LVM_FINDITEM = LVM_FIRST + 13
    Private Const LVM_GETITEMTEXT = LVM_FIRST + 45
    Private Const LVM_SORTITEMS = LVM_FIRST + 48
    Private Const LVM_GETHEADER = LVM_FIRST + 31
    Private Const LVM_GETITEMCOUNT = (LVM_FIRST + 4)
    Private Const HDM_FIRST = &H1200 '// Header messages
    Private Const HDM_GETITEMCOUNT = (HDM_FIRST + 0)
    Private Const HDM_ORDERTOINDEX = (HDM_FIRST + 15)
    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 PROCESS_ALL_ACCESS As Long = &H1F0FFF
    Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Private Const MAX_LVMSTRING As Long = 255 '可根椐读取数据长度设置适当的数值
    Private Const MEM_COMMIT = &H1000
    Private Const MEM_RELEASE = &H8000
    Private Const PAGE_READWRITE = &H4
    Private Const LVIF_TEXT As Long = &H1
 
 
 
 
 
 
    'API declarations
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Byte, ByVal nSize As Long, ByVal lpNumberOfBytesWritten 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 Long, ByRef lpBuffer As LV_ITEMA, ByVal nSize As Long, ByVal lpNumberOfBytesWritten 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 OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Int32, ByVal hWnd2 As Int32, ByVal lpsz1 As String, ByVal lpsz2 As String) As Int32
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Int32) As Int32
 
 
 
 
 
 
    Public Structure LV_ITEMA
        Dim mask As Long
        Dim iItem As Long
        Dim iSubItem As Long
        Dim state As Long
        Dim stateMask As Long
        Dim pszText As Long
        Dim cchTextMax As Long
        Dim iImage As Long
        Dim lParam As Long
        Dim iIndent As Long
    End Structure
 
 
 
    Public getm As String = ""
 
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        Dim hwnd0 As Long
        Dim hwnd1 As Long
        Dim str As String
        str = Space(255)
 
 
        '查找窗口名称为《刀具路径列表》的窗口句柄号
        hwnd0 = FindWindow(vbNullString, "刀具路径列表")
        MsgBox("hwnd0=" & hwnd0) 'ok
        '查找类名为syslistview32的窗口句柄号
        hwnd1 = FindWindowEx(hwnd0, 0&, "syslistview32", vbNullString)
        MsgBox("hwnd1=" & hwnd1) 'ok
        Call GetListViewTextArray(hwnd1)
    End Sub
 
 
    Public Function GetListViewTextArray(ByVal hWindow As Long) As String()
 
        Dim myItem() As LV_ITEMA
        Dim PHandle As Long
        Dim ProcessId As Long
        Dim PStrBufferMemory As Long
        Dim PMyItemMemory As Long
        Dim StrBuffer(MAX_LVMSTRING) As Byte
        Dim TmpString As String
        Dim Ih As Long, J As Long, HCount As Long
        Dim StrArr() As String, ItemString As String
        Dim Ji As Long, MyItemLength() As Long
 
        GetWindowThreadProcessId(hWindow, ProcessId)
 
 
        MsgBox("ProcessId=" & ProcessId) 'ok
 
 
        HCount = SendMessage(hWindow, LVM_GETHEADER, 0, 0)
 
        If HCount > 0 Then
            HCount = SendMessage(HCount, HDM_GETITEMCOUNT, 0, 0) - 1
            MsgBox("hcount=" & HCount) 'ok
        Else
            HCount = 0
        End If
        PHandle = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, ProcessId)
 
        MsgBox("phandle=" & PHandle) 'ok
 
 
        ReDim myItem(HCount)
        ReDim MyItemLength(HCount)
        PStrBufferMemory = VirtualAllocEx(PHandle, 0, MAX_LVMSTRING, MEM_COMMIT, PAGE_READWRITE)
        PMyItemMemory = VirtualAllocEx(PHandle, 0, MAX_LVMSTRING, MEM_COMMIT, PAGE_READWRITE)
        Ji = SendMessage(hWindow, LVM_GETITEMCOUNT, 0, 0) - 1
 
        On Error GoTo err1
        ReDim StrArr(Ji)
 
        For Ih = 0 To HCount
            myItem(Ih).mask = LVIF_TEXT
            myItem(Ih).iSubItem = Ih
            myItem(Ih).pszText = PStrBufferMemory
            myItem(Ih).cchTextMax = MAX_LVMSTRING
            MyItemLength(Ih) = Len(myItem(Ih))
 
        Next
 
        For J = 0 To Ji
 
            ItemString = ""
            For Ih = 0 To HCount
 
                WriteProcessMemory(PHandle, PMyItemMemory, myItem(Ih), MyItemLength(Ih), 0)
 
 
 
                If SendMessage(hWindow, LVM_GETITEMTEXT, J, PMyItemMemory) > 0 Then '程序在这里循环,然后崩溃
 
                    ReadProcessMemory(PHandle, PStrBufferMemory, StrBuffer(0), MAX_LVMSTRING, 0)
 
                    TmpString = System.Text.Encoding.Default.GetString(StrBuffer)
 
                    TmpString = Mid(TmpString, InStr(TmpString, vbNullChar) - 1)
                    ItemString = ItemString & TmpString & Chr(9) ' Chr$(32)
                End If
            Next
            If ItemString <> "" Then
                StrArr(J) = Mid(ItemString, Len(ItemString) - 1)
 
            End If
        Next
 
        VirtualFreeEx(PHandle, PMyItemMemory, 0, MEM_RELEASE)
        VirtualFreeEx(PHandle, PStrBufferMemory, 0, MEM_RELEASE)
        CloseHandle(PHandle)
        ItemString = ""
        GetListViewTextArray = StrArr
 
        Exit Function
err1:
        MsgBox("不是Listview类吧?", vbInformation)
    End Function
End Class

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32
lParam的声明改了下,下面的调用就不会出问题了
If SendMessage(hWindow, LVM_GETITEMTEXT, J, PMyItemMemory) > 0 Then '程序在这里循环,然后崩溃
我测试时FindWindowEx调用就出错了,就把所有的long型定义都改成了int32
TmpString = Mid(TmpString, InStr(TmpString, vbNullChar) - 1) 改成
TmpString = Mid(TmpString, InStr(TmpString,1, vbNullChar) - 1)

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    Hadoop2.2.0在eclipse控制台没有
    maven如何加自定义的包
    redhat 2.6 (santigo 5.6) vsftp
    shell如何实现自动填写操作执行下
    linux shell 文件配置sh:color:
    shell script语法一定要加path吗
    SecureCRT如何访问虚拟机vmWare中
    C#如何读取WINDOWS的放大系数
    cximge的图如何存入数据库并提取
    DBGRID控件显示查询结果文本类型
    Hadoop2.2.0在eclipse控制台没有
    maven如何加自定义的包
    redhat 2.6 (santigo 5.6) vsftp
    shell如何实现自动填写操作执行下
    linux shell 文件配置sh:color:
    shell script语法一定要加path吗
    SecureCRT如何访问虚拟机vmWare中
    C#如何读取WINDOWS的放大系数
    cximge的图如何存入数据库并提取
    DBGRID控件显示查询结果文本类型
    Winsock控件收发二进制字节三
    Winsock控件收发二进制字节三
    filelistbox如何按文件名(数
    VB引用部件mscomctl.ocx时提
    VB如何设置IE代理IP并且马上
    vb程序在别的电脑上无法运行
    VB6中如何让很多独立文本框中
    VB如何把内容写到txt上
    VB如何设置Access 的字段有效
    VB调用dll时用什么变量对应C
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |