FindWindowExA 怎么找文本框的句柄。最好有原码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FindWindowExA 怎么找文本框的句柄。最好有原码相关的知识,希望对你有一定的参考价值。

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
比如在一个游戏里面要找一个文本框的句柄,已经知道游戏窗口句柄,游戏进程PID

楼上诸位说得满多的,但是有一点没有提到
楼主是找DX游戏里面的子窗口句柄吗?如果是DX游戏里面的,一般来说是无法获得的,因为它的子窗口是画的,
首先下载一个spy++看看可不可以查到句柄,如果查不到,那就是画的窗口,没有句柄,如果可以找到,则代码如下
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 Sub Command1_Click()
Dim MyHwnd
'如果窗口类名或者标题不能确定则参数设置为 vbNullString
'如果已知要找的子窗口位于某另一个子窗口之后,则把第2个参数 0 改为另一个子窗口句柄
MyHwnd = FindWindowEx(父窗口句柄, 0, 子窗口类名, 子窗口标题)
MsgBox MyHwnd
End Sub
参考技术A 有个前提,就是你要找的文本框的类名已知。如果是普通的文本框,类名是Edit。如果是富文本框,类名是RichEdit。如果是VB中的文本框,类名是ThunderTextBox。把这个类名套到下面代码里即可。
假设hW是已知的游戏窗口句柄。代码如下。
=============
Dim hTextBox As OLE_HANDLE
hTextBox = findwindowex(hW, 0, "Edit", vbNullString)
参考技术B vb通用枚举进程模块

Option Explicit

'************************************* 用于枚举进程*********************************
'CreateToolhelpSnapshot为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD])建立一个快照[snapshot]。

'参数:
'dwFlags

'TH32CS_INHERIT -声明快照句柄是可继承的
'TH32CS_SNAPall -在快照中包含系统中所有的进程和线程
'TH32CS_SNAPheaplist -在快照中包含在th32ProcessID中指定的进程的所有的堆
'TH32CS_SNAPmodule -在快照中包含在th32ProcessID中指定的进程的所有的模块
'TH32CS_SNAPPROCESS -在快照中包含系统中所有的进程
'TH32CS_SNAPthread -在快照中包含系统中所有的线程

'th32ProcessID

'[输入]指定将要快照的进程ID。如果该参数为0表示快照当前进程。
'该参数只有在设置了TH32CS_SNAPHEAPLIST或TH32CS_SNAPMOUDLE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long

'获得系统快照中的第一个进程的信息
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long

'获得系统快照中的下一个进程的信息
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long

'参数: Handle hSnapshot传入的Snapshot句柄
'参数:LPMODULEENTRY3 lpme 指向一个 MODULEENTRY32结构的指针
'作用:从Snapshot得到第一个进程记录信息
Private Declare Function Module32First Lib "kernel32" (ByVal hSnapShot As Long, lppe As MODULEENTRY32) As Long

'参数: Handle hSnapshot传入的Snapshot句柄
'参数:LPMODULEENTRY3 lpme 指向一个 MODULEENTRY32结构的指针
'作用: 从Snapshot得到下一个Module记录信息
Private Declare Function Module32Next Lib "kernel32" (ByVal hSnapShot As Long, lppe As MODULEENTRY32) As Long

'关闭句柄
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Type PROCESSENTRY32
dwSize As Long '结构大小
cntUsage As Long '此进程的引用计数
th32ProcessID As Long '进程ID
th32DefaultHeapID As Long '进程默认堆ID
th32ModuleID As Long '进程模块ID
cntThreads As Long '此进程开启的线程计数
th32ParentProcessID As Long '父进程ID
pcPriClassBase As Long '线程优先权
dwFlags As Long '保留
szExeFile As String * 260 '进程全名
End Type

Private Const TH32CS_SNAPPROCESS = &H2 'TH32CS_SNAPPROCESS -在快照中包含系统中所有的进程?
Private Const TH32CS_SNAPmodule = &H8 '表示对象为由th32ProcessID参数指定的进程调用的所有模块

Private Type MODULEENTRY32
dwSize As Long '指定结构的大小,在调用Module32First前需要设置,否则将会失败
th32ModuleID As Long '模块号
th32ProcessID As Long '包含本模块的进程号
GlblcntUsage As Long '本模块的全局引用计数
ProccntUsage As Long '包含模块的进程上下文中的模块引用计数
modBaseAddr As Byte '模块基地址
modBaseSize As Long '模块大小(字节数)
hModule As Long '包含模块的进程上下文中的hModule句柄
szModule As String * 256 '模块名
szExePath As String * 1024 '模块对应的文件名和路径
End Type

'*************************************************************************
'**函 数 名: GetProcess
'**输 入: ByVal frmRuningProcess(Form) - 直接传入各对象名
'** : ByVal treProcess(TreeView) -
'** : ByVal lblProcessNumber(Label) -
'**输 出: 无
'**功能描述:建立进程树结构
'**全局变量:
'**调用模块:
'**作 者: Mr.David
'**日 期: 2007-11-27 14:09:37
'**修 改 人:
'**日 期:
'**版 本: V1.0.0
'*************************************************************************
Public Sub GetProcess(ByVal frmRuningProcess As Form, ByVal treProcess As TreeView, ByVal lblProcessNumber As Label)

Dim lngResult As Long
Dim hSnapShot As Long '这些定义和VB定义有点不同,由于是Api使用,那就保留其所有权了。
Dim hMSnapshot As Long

Dim strTreTxt As String
Dim lngRet As Long
Dim treNode As Node
Dim lngProcCount As Long
Dim strTreKey As String

Dim MEY As MODULEENTRY32
Dim PEE As PROCESSENTRY32

On Error GoTo PROC_ERR

hSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0) '快照所有进程

PEE.dwSize = Len(PEE)
MEY.dwSize = Len(MEY)

lngResult = ProcessFirst(hSnapShot, PEE) '获取第一进程

'外循环读取进程名
Do While lngResult <> 0

lngProcCount = lngProcCount + 1 '累计进程数

hMSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPmodule, PEE.th32ProcessID) '快照当前进程模块
MEY.szExePath = Space$(256)

strTreKey = PEE.szExeFile '对树根关键字采用的PEE.szExeFile,注意运行同一程序多个实例会转入PROC_ERR处理
strTreTxt = PEE.szExeFile

Set treNode = treProcess.Nodes.Add(, , strTreKey, strTreTxt) '进程树根是进程名

lngRet = Module32First(hMSnapshot, MEY)

'内循环读取模块名
Do While lngRet > 0

'注意一个进程的最后一个模块列出后继续列出下一个会出现类似 ??1??鏴? 的名称,这显然不是我们需要的,排除了。
'另外TreeView控件会自己处理文件名的Chr(0)字符,我们就由它处理了。
If InStr(1, MEY.szExePath, "?") = 0 Then

Set treNode = treProcess.Nodes.Add(strTreKey, tvwChild, , MEY.szExePath) '列出模块

End If

lngRet = Module32Next(hMSnapshot, MEY) '获取下一模块

Loop

'treNode.EnsureVisible '展开分支,可以选用这句
Call CloseHandle(hMSnapshot) '关闭模块快照句柄
lngResult = ProcessNext(hSnapShot, PEE) '获取下一进程

Loop

Call CloseHandle(hSnapShot) '关闭进程快照句柄

lblProcessNumber.Caption = "当前进程数:" & lngProcCount
lblProcessNumber.Visible = True

Exit Sub

PROC_ERR:

'如果发生集合中的关键字不唯一,则关键字重命名,比如Nt系统会存在多个Svchost进程,此关键字这里不重要,随便处理一下
If Err.Number = 35602 Then strTreKey = strTreKey & "1"
Resume

End Sub

调用例子:
'先分别添加一个TreeView命名为treProcess,和Label命名为lblProcessNumber。
treProcess.Nodes.Clear
Call GetProcess(frmRuningProcess, treProcess, lblProcessNumber)

vb 获取文本框内容

我想通过VB获取其他EXE中文本框的内容!!
例如QQ输入框的内容!!
用Api怎么实现???
哪位高手教教我!!
必有重谢
我也知道比较喃!!
难道就没有什么办法?
我知道Spy++ Lite就可以获取!

这样子说!!1
我是想写个键盘记录器!
在本机记录本机QQ输入框输入的内容!!1

我不是要QQ密码框!!
是要QQ聊天那个输入框

没有比如。哪个就哪个。因为获取的程序窗体标题不一样。那句柄就不一样。
就说qq。输入框应该可以获取拦截。首先还是findwindow查句柄。然后使用的是emd忘记了。遍历文本框。进行指定类查找。然后getwindowstext就可以了。。前提句柄必须正确。可以先用查句柄的先查到。然后再进行验证。
qq密码远程穷举爆破的我作了一个。通过tm操作的。自动识别。
不过qq密码框是特殊加密的。不是密码框其他的就好说一点

原来是功夫未到家就要搞另类。无语了。帮不了你
参考技术A 先用findwindow找到QQ登陆窗体的句柄,然后用findwindowex找到QQ登陆窗体上文本框的句柄,最后用getwindowtext获取文本框的数据就可以了,在网吧电脑没装VB,你自己试着写下吧,可以写的,我写过,只是QQ的密码输入框加过密,获取不了,这是腾讯技术问题,可以获取QQ号码。

以上是关于FindWindowExA 怎么找文本框的句柄。最好有原码的主要内容,如果未能解决你的问题,请参考以下文章

pycharm如何将光标移动到最后一个字符

pywin32 怎么获取 windows 的窗体内文本框的内容

MFC如何改变消息框的三个按钮的文本值

我需要向第三方的程序的文本框中赋值。代码如下,但是一直获取不到窗口的句柄?

vb 获取文本框内容

c# 在知道数据窗口的句柄的时候如何获得数据窗口的数据