vb里面用findwindowex查找不到东西

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb里面用findwindowex查找不到东西相关的知识,希望对你有一定的参考价值。

我用软件能查到该一个窗体里的一个文本框的名字是“ThunderRT6TextBox”,但是在VB里用findwindowex却找不到,请问一下该怎么处理呢? 我用同样的方法能找到其他,比如该窗体里的标签控件。

能找到标签控件?那么这个窗体一定不是VB写的,VB的标签控件是找不到的
用findwindowex必须先用findwindow查到窗体的hwnd
再用findwindowex(hwnd,0,"类名","控件标题")
参考技术A findwindow是取窗口句柄的API
其基本格式是:hwndd=findwindow(窗口类型,"窗口标题")

例:
比如我们要找一个新建记事本的窗口句柄
hwndd=findwindow(vbnullstring,"新建 文本文档.txt - 记事本")
参考技术B 应该是它的前面还有一个文本框,名称也是“ThunderRT6TextBox”,所以只找到前一个。

vb代码之------FindWindow and FindWindowEx控制其他程序

 

  应该有不少童鞋都喜欢用自己的程序来控制其他程序吧,但是又恨自己技术浅,那么今天给大家带来一个简单的vb控制器

  在此之前,我想说一下句柄

  对于Win32程序员来说,如果不知道句柄,那么也太逊了吧,那句柄是什么呢?百度百科是这样说的 "个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例"

  首先,你可以知道句柄是一个整数,这个不难理解吧,还有是用来标识应用程序的实例,也就是一个整数标识了一个应用程序。在操作系统中,每一个程序(窗口、按钮......)等都会有一个句柄,我们只要抓住他的句柄,就可以对应的对她进行操作。

  好了,废话不多说,咋们开始敲吧

  技术分享

好了,看到这个图了吧,咋们就用vb来控制这个文本框的内容(上面的程序是Win7中自带的程序 《便笺》)

要使用的两个主要函数FindWindow 和 FindWindowEx

在vb中要先声明,如下

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long

 

附加函数

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Private Const WM_SETTEXT As Long = &HC

解释函数

FindWindow:

寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题)

FindWindowEx:

在窗口列表中寻找与指定条件相符的第一个子窗口

SendMessage:

如果不理解Windows的消息机制,那么这个函数不是很好理解,最简单的说法就是给一个窗口发送消息

 

首先,我们用Spy++看一下便笺中所有的句柄

技术分享

然后用查找工具找到文本框的类名

技术分享

 

 可以看到,文本框的类名是{a64c3a50-b714-4e1f-a723-78db57a20a29},我们不能直接查找这类名,要从他的爸爸的窗体中查找

他的爸爸有DirectUIHWND、CtrlNotifySink

好了,首先用FindWindow找到这个程序的窗口

Dim hw As Long
Dim hw2 As Long
hw = FindWindow(vbNullString, "便笺")

hw这个变量中就存放了便笺这个程序的句柄

然后

hw2 = FindWindowEx(hw, 0, "DirectUIHWND", vbNullString)

hw2存放了hw的儿子DirectUIHWND

接着

hw2 = FindWindowEx(hw2, 0, "CtrlNotifySink", vbNullString)

此时的hw2中存放了DirectUIHWND的儿子CtrlNotifySink

最后找到文本框

hw2 = FindWindowEx(hw2, 0, "{a64c3a50-b714-4e1f-a723-78db57a20a29}", vbNullString)

这个hw2中存放了我们要找的文本框,也就是hw的儿子的儿子的儿子

好了,文本框的句柄我们找到了,接下来怎么设置他的内容呢

还需要一个函数

SendMessage

用这个函数给文本框发送一个WM_SETTEXT消息

 

 SendMessage中lParam中附加了消息的内容

代码如下

SendMessage hw2, WM_SETTEXT, 0, ByVal "我是被vb程序改变的内容"

全部代码

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Private Const WM_SETTEXT As Long = &HC

 

Private Sub Form_Load()
Dim hw As Long
Dim hw2 As Long
hw = FindWindow(vbNullString, "便笺")
If hw <> 0 Then

hw2 = FindWindowEx(hw, 0, "DirectUIHWND", vbNullString)
hw2 = FindWindowEx(hw2, 0, "CtrlNotifySink", vbNullString)
hw2 = FindWindowEx(hw2, 0, "{a64c3a50-b714-4e1f-a723-78db57a20a29}", vbNullString)
If hw2 <> 0 Then
SendMessage hw2, WM_SETTEXT, 0, ByVal "我是被vb程序改变的内容"

Else
MsgBox "文本框没有找到"
End If

Else
MsgBox "便笺没有找到"
End If

End Sub

技术分享

欢迎加入我的QQ群:183435019一起学习,一起讨论

 




















以上是关于vb里面用findwindowex查找不到东西的主要内容,如果未能解决你的问题,请参考以下文章

在VB中如何使用FindWindow或FindWindowEx函数查找某窗体句柄

请问vb中如何查找程序里面的多个文本框(或其他控件)的句柄啊?

vb代码之------FindWindow and FindWindowEx控制其他程序

为啥 FindWindowEx 找不到我的所有按钮?

关于vb2005中用到的arp函数findwindow无法在user32.dll中找不到findwindowA接口

VB中findwindowex函数的用法。。