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一起学习,一起讨论