• VB.net 通过句柄操作其他窗口


    Imports System.Text
    Imports System.Runtime.InteropServices
     
    Public Class Form1
        ' 相关API函数声明,注释掉的这里没用到,但是也比较常用吧,这些函数的功能都能搜到。
        Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
        Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
        Private Delegate Function EnumChildProc(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Boolean
        Private Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As IntPtr, ByVal lpEnumFunc As EnumChildProc, ByVal lParam As Integer) As Boolean
        Private Declare Auto Function SendMessage Lib "User32.dll" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
        'Private Declare Function CheckDlgButton Lib "user32" Alias "CheckDLGButtonA" (ByVal hDlg As IntPtr, ByVal nIDButton As IntPtr, ByVal wCheck As Integer) As Integer
        Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As IntPtr, ByVal lpClassName As StringBuilder, ByVal nMaxCount As Integer) As Integer
        'Private Declare Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As IntPtr, ByVal lpdwProcessId As Long) As Integer
        Private Declare Auto Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLength" (ByVal hwnd As IntPtr) As Integer
        Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
     
     
        ' 相关消息定义,也有没用到的
        Const WM_SETTEXT = &HC
        Const WM_GETTEXT = &HD
        'Const WM_SETFOCUS = &H7
        'Const WM_KILLFOCUS = &H8
        'Const WM_CLOSE = &H10
        'Const WM_SYSCOMMAND = &H112
        'Const SC_CLOSE = &HF060&
        'Const SC_MINIMIZE = &HF020&
     
        Const BM_GETCHECK = &HF0
        Const BM_SETCHECK = &HF1
        Const BM_GETSTATE = &HF2
        Const BM_SETSTATE = &HF3
        Const BM_SETSTYLE = &HF4
        Const BM_CLICK = &HF5
        'Const BM_GETIMAGE = &HF6
        'Const BM_SETIMAGE = &HF7
        Const BST_UNCHECKED = &O0
        Const BST_CHECKED = &O1
        Const BST_INDETERMINATE = &O2
     
        ' 储存窗口句柄
        Dim WindowHandle As IntPtr
        ' 储存两个(或者多个)编辑框句柄
        Dim EditHandle As New List(Of IntPtr)
        Dim EditWindowsText As List(Of String)
        ' 储存复选框句柄
        Dim CheckHandle As IntPtr = 0
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Button1_Click(sender, e)
     
        End Sub
     
        ' EnumChildWindows 回调函数,该函数名作为API函数EnumChildWindows 的一个参数
        ' 该函数实现了枚举各个子窗口,找出编辑框属性的功能
        Public Function EnumChildProcC(ByVal hwnd As IntPtr, ByVal lParam As Integer) As Boolean
            Dim dwWindowClass As StringBuilder = New StringBuilder(100)
     
            ' 获得某一个句柄的类名
            GetClassName(hwnd, dwWindowClass, 100)
            If dwWindowClass.ToString.Contains("EDIT") Or dwWindowClass.ToString.Contains("Edit") Then     ' 类名包含EDIT的为编辑框
                EditHandle.Add(hwnd)                        ' 存储该句柄
            End If
     
            ' 返回 True 一直枚举完
            Return True
        End Function
     
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            WindowHandle = FindWindow(vbNullString, "登陆")
            If WindowHandle.ToInt32 = 0 Then
                MsgBox("未捕获到窗口" + "<登陆>")
                Return
            End If
     
            ' 枚举所有主窗口的子窗口(控件),枚举时自动调用回调函数,完成编辑框句柄的获取
            EnumChildWindows(WindowHandle, AddressOf EnumChildProcC, 0)
            ' 寻找复选框
            CheckHandle = FindWindowEx(WindowHandle, IntPtr.Zero, vbNullString, "记住密码")
            Dim str As New StringBuilder
            Dim j As Integer = 0
            ' 对编辑框文本赋值
            For j = 0 To EditHandle.Count - 1
                SendMessage(EditHandle(j), WM_SETTEXT, 0, "Text")
                'GetWindowText(EditHandle(j), str, 20)
                'EditWindowsText.Add(Str.ToString)
                'Str.Clear()
            Next
            If EditHandle.Count = 0 Then
                MsgBox("未找到输入框!")
            End If        
     
            If CheckHandle.ToInt32 <> 0 Then
                'CheckDlgButton(WindowHandle, id, 1)
                ' 对复选框进行鼠标单击操作
                SendMessage(CheckHandle, BM_CLICK, 0, 0)
     
                'SendMessage(CheckHandle, BM_SETCHECK, True, 0)
            End If
        End Sub
         
    End Class

  • 相关阅读:
    2020年9月12日 线程的安全问题:同步方法;
    2020年9月12日 线程的安全问题:线程使用共享数据 产生的安全问题
    2020年9月11日 编写龟兔赛跑的多线程程序
    2020年9月9日 为什么要有包装类、包装类有哪些、装箱与拆箱、包装类的API、包装类对象的缓存问题
    2020年9月4日 try catch finally遇见return的时候返回值是啥?(面试题)
    2020年9月4日 异常
    2020年9月4日 异常处理
    2020年9月3日 内部类总结
    2020年9月3日 静态导入
    2020年9月3日 自定义注解和元注解
  • 原文地址:https://www.cnblogs.com/rj888/p/11802399.html
Copyright © 2020-2023  润新知