VB中findwindowex函数的用法。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB中findwindowex函数的用法。。相关的知识,希望对你有一定的参考价值。

Private Sub Command1_Click()
hWnd2 = FindWindow(vbNullString, "计算器")
MsgBox hWnd2, , " 。"
hwnd = FindWindowEx(vbNullString, hWnd2, "edit", vbNullString)
MsgBox hwnd, , " "

End Sub
我这样来。hwnd这句话就有问题。说什么函数或接口标记为限制或VB使用了不支持的自动类型 类型错应该不会,我定义过也是这样错的。 麻烦再附上之后给计算器的"edit"类用sendmessage函数发送一个字符串str1的代码

  FindWindowEx函数

  函数功能:在窗口列表中寻找与指定条件相符的第一个子窗口 。
  该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
  参数:(1)hwndParent:要查找的子窗口所在的父窗口的句柄(如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口)。
  如果hwndParent为 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。
  Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。
  (2)hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。
  (3)lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。
  (4)lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。
  返回值:Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
  如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。
  若想获得更多错误信息,请调用GetLastError函数。
  声明:1.VB 声明
  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
  2.C# 声明
  [DllImport("user32.dll", SetLastError = true)]
  public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
  3.VB .NET 声明
  <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
  Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, _
  ByVal childAfter As IntPtr, _
  ByVal lclassName As String, _
  ByVal windowTitle As String) As IntPtr
  End Function

  相关例子:
  'Example Name: Changing a VB Toolbar to a Rebar-Style Toolbar
  BAS Moduel Code
  Option Explicit
  Public Const WM_USER= &H400
  Public Const TB_SETSTYLE = WM_USER + 56
  Public Const TB_GETSTYLE = WM_USER + 57
  Public Const TBSTYLE_FLAT = &H800
  Public Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" _
  (ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long
  Public 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
  '--end block--'
  ' Form Code
  Option Explicit
  Private Sub Form_Load()
  With Combo1
  .Width = Toolbar1.Buttons("combo1").Width
  .Top = (Toolbar1.Height - Combo1.Height) \ 2
  .Left = Toolbar1.Buttons("combo1").Left
  .AddItem "Black" ' Add colours for text.
参考技术A 寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题)

返回值:Long,找到窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError

参数:lpClassName ---- String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为vbNullString,表示接收任何类

lpWindowName --- String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题

很少要求同时按类与窗口名搜索。为向自己不准备参数传递一个零,最简便的办法是传递vbNullString常数
示例
Dim hw& , cnt&
Dim rttitle As String * 256
hw& = FindWindow("ThunderRT5Main", vbNullString) ' ThunderRTMain under VB4
cnt = GetWindowText(hw& , rttitle, 255)
MsgBox Left$(rttitle, cnt), 0, "RTMain title"
参考技术B 这个函数在msdn里有详细描述,请查询。

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里面用findwindowex查找不到东西

vb里面用findwindowex查找不到东西

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

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

vb2013 已获得主窗口句柄,怎么遍历所有子窗句柄到TreeView中?

vb如何控制其他程序?