调用FindWindowEx老是出问题
HWND hwnd2=0;
HWND hwnd2=FindWindowEx(HWND hwnd,HWND hwnd2,0,0);
//第二个参数使用寻找到的窗口句柄
// 如果父窗口下不止一个子窗口,就需要判断循环,直到返回0,寻找失败,
VB中findwindowex函数的用法
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.
易语言用FindWindowExA寻找子窗口静态编译问题
= =?如果单单取窗口句柄,我记得函数是 FindWindows,没记得有ExA啊?
你用的什么版本,静态编译有时候经常会不兼容什么来着。。
vb 隐藏已知句柄的窗口 & vb FindWindowEx的用法
Public Declare Function ShowWindow Lib “user32“ Alias “ShowWindow“ (ByVal hwnd As Long, ByVal nCmdShow As Long) 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
’以上两个申明放标准模块中。
ShowWindow a,0 ’0隐藏,5显示。
hWindow = FindWindowEx(b, 0, “SHELLDLL_DefView“, ““)
以下一个实例共参考
利用VB完全控制你的桌面图标
Windows中的桌面图标的排列方式是否让你感到厌倦而想按照自己的想法排列图标。是否想改变桌面图标文字的背景而不
使在图标文字下出现一个个难看的色块。这里我要介绍如何通过VB来对桌面的图标进行彻底的改变。
其实在Windows下的桌面以及任务栏等都是窗口对象,我们可以利用Windows API函数FindWindow和FindWindowEx来获得
它们的句柄,然后再调用其它相应的API函数来控制它们。而放置桌面图标的窗口是一个ListView对象,利用SendMessage函数
向该窗口发送相应的消息,就可以对图标进行修改了。下面是具体的程序实现。
首先在VB中建立一个新的工程,在Form1中加入三个CommandButton控件,然后在Form1的代码窗口中加入以下代码:
Option Explicit
Private Type POINTAPI
x As Long
y As Long
End Type
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
Private Declare Function UpdateWindow Lib “user32“ (ByVal hwnd As Long) As Long
Private Declare Function SendMessage Lib “user32“ Alias “SendMessageA“ (ByVal _
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) _
As Long
Private Declare Function SendMessageP Lib “user32“ Alias “SendMessageA“ (ByVal _
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) _
As Long
Private Declare Function GetSysColor Lib “user32“ (ByVal nIndex As Long) As Long
Private Declare Function SetSysColors Lib “user32“ (ByVal nChanges As Long, _
lpSysColor As Long, lpColorValues As Long) As Long
Const LVM_FIRST = &H1000
Const LVM_GETITEMCOUNT = LVM_FIRST + 4
Const LVM_SETTEXTCOLOR = LVM_FIRST + 36
Const LVM_REDRAWITEMS = LVM_FIRST + 21
Const LVM_SETTEXTBKCOLOR = LVM_FIRST + 38
Const LVM_SETITEMPOSITION = LVM_FIRST + 15
Const COLOR_DESKTOP = 1
’RestoreColor函数回复默认的图标文字颜色和背景
Sub RestoreColor()
Dim lColor As Long
lColor = GetSysColor(COLOR_DESKTOP)
SetSysColors 1, COLOR_DESKTOP, lColor
End Sub
Sub SetIconText(clFore, clBack As Long, bTrans As Boolean)
Dim hWindow As Long
Dim lItemCount As Long
’通过三步查找到放置桌面图表的窗口
hWindow = FindWindow(“Progman“, “Program Manager“)
hWindow = FindWindowEx(hWindow, 0, “SHELLDLL_DefView“, ““)
hWindow = FindWindowEx(hWindow, 0, “SysListView32“, ““)
If bTrans Then ’透明背景
SendMessage hWindow, LVM_SETTEXTBKCOLOR, 0, &HFFFFFFFF
Else ’非透明背景
SendMessage hWindow, LVM_SETTEXTBKCOLOR, 0, clBack
End If
’设置图标文字的颜色
SendMessage hWindow, LVM_SETTEXTCOLOR, 0, clFore
’重新绘制所有的图标
lItemCount = SendMessage(hWindow, LVM_GETITEMCOUNT, 0, 0)
SendMessage hWindow, LVM_REDRAWITEMS, 0, lItemCount – 1
’更新窗口
UpdateWindow hWindow
End Sub
Sub ArrangeDesktopIcon(iWidth As Integer, iHeight As Integer)
Dim hWindow As Long
Dim i1, i2, i, iCount As Integer
Dim po As POINTAPI
’通过三步查找到放置桌面图表的窗口
hWindow = FindWindow(“Progman“, “Program Manager“)
hWindow = FindWindowEx(hWindow, 0, “SHELLDLL_DefView“, ““)
hWindow = FindWindowEx(hWindow, 0, “SysListView32“, ““)
i1 = 20: i2 = 20
iCount = SendMessage(hWindow, LVM_GETITEMCOUNT, 0, 0)
For i = 0 To iCount – 1
po.x = i1: po.y = i2
’发送LVM_SETITEMPOSITION消息排列图标
Call SendMessage(hWindow, LVM_SETITEMPOSITION, i, i2 * 65536 + i1)
i1 = i1 + iWidth
If i1 》 ((Screen.Width / 15) – 32) Then
i1 = 20
i2 = i2 + iHeight
End If
Next i
SendMessage hWindow, LVM_REDRAWITEMS, 0, iCount – 1
’更新窗口
UpdateWindow hWindow
End Sub
Private Sub Command1_Click()
’设置图标文字的颜色为蓝色,背景色为黑色,背景为透明
SetIconText vbBlue, vbBlack, True
End Sub
Private Sub Command2_Click()
RestoreColor
End Sub
Private Sub Command3_Click()
’以100×100像素为单位排列图标
ArrangeDesktopIcon 100, 100
End Sub
Private Sub Form_Load()
Command1.Caption = “设置文字背景“
Command2.Caption = “恢复文字背景“
Command3.Caption = “排列桌面图标“
End Sub
运行程序,点击Command1,可以看到桌面图标的文本景色变成了蓝色,如果你设置了桌面图片,还可以看到文字
的背景变成了透明的而不是在下面有一个难看的色块,点击Command2可以恢复Windows的默认设置,点击Command3可以
使你的桌面图标以横排的方式排列,不过前提是要将桌面图标的自动排列属性设置为False。
以上程序在VB6,Windows98,Windows2000下运行通过。
VB:FindWindowEx 用途,参数
在窗口列表中寻找与指定条件相符的第一个子窗口 。
该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
VB 声明
Private Declare Function FindWindowEx Lib “user32“ Alias “FindWindowExA“ (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
参数;
(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,则为所有窗口全匹配。
易语言FindwindowExA函数如何取所有句柄
如图所示,本函数在DLL命令中添加,数组所有子句柄保存所有组件句柄
易语言是一门计算机编程语言。以“易”著称,以中文作为程序代码表达的语言形式。易语言的创始人是吴涛。早期版本的名字为E语言。易语言最早的版本的发布可追溯至2000年9月11日。创造易语言的初衷是进行用中文来编写程序的实践。从2000年至今,易语言已经发展到一定的规模,功能上、用户数量上都十分可观。2015年计划推出移动版编程工具,用于编译安卓系统手机APP!
FindWindowExA 怎么找文本框的句柄最好有原码
楼上诸位说得满多的,但是有一点没有提到
楼主是找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
FindWindowEx用法怎么用
找子窗口要用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
看里面的参数,第一个和第二个:ByVal hWnd1 As Long,ByVal hWnd2 As Long,这里都需要传入句柄,再看第三个和第四个:ByVal lpsz1 As String, ByVal lpsz2 As String,这里所要传入的是字符串。具体意思如下:
hWnd1 ———- Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)
hWnd2 ———- Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
lpsz1 ———- String,欲搜索的类名。零表示忽略,注意一般传入vbNullString
lpsz2 ———- String,欲搜索的类名。零表示忽略,注意一般传入vbNullString
用实践帮我们分析,这里还是拿记事本开刀。打开一个记事本,新建一个标准EXE,接着新建一个CommandButton,Caption设置为:设置文本。OK,写入以下代码:
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
Private Declare Function EnableWindow Lib “user32“ (ByVal hwnd As Long, ByVal fEnable As Long) As Long
Private Sub Command1_Click()
Dim WindowHandle As Long, ChildWindowHandle As Long
WindowHandle = FindWindow(vbNullString, “无标题 – 记事本“)
If WindowHandle Then ’如果获取句柄成功
ChildWindowHandle = FindWindowEx(WindowHandle, 0, “Edit“, vbNullString)
If ChildWindowHandle Then ’如果成功获取子句柄
EnableWindow ChildWindowHandle, False ’禁用子窗口
Else
MsgBox “无法获取子窗口“
End If
End If
End Sub
好了,帮大家分析。看第一行:Dim WindowHandle As Long, ChildWindowHandle As Long,用于储存获取的句柄的。WindowHandle = FindWindow(vbNullString, “无标题 – 记事本“)这个就不用讲了,上面已经讲过。
ChildWindowHandle = FindWindowEx(WindowHandle, 0, “Edit“, vbNullString),这一段是通过我们已经获取的记事本句柄获取其中的子窗口句柄。大家可以用Spy++查看到记事本的TextBox类,然后根据类名写入即可。
EnableWindow ChildWindowHandle, False 这又是一个新的API,虽然前面我没有前过,但是这个API使用起来及其简单。这个API中有两个参数,第一个理所当然是传入窗口句柄,第二个为Long变量,其实这里应该设为Boolean变量好些,主要是用来处理当前窗口是否可用。True可用,False禁用。
现在F5运行,记得打开记事本哦,然后点击Command1,看看能不能在记事本的文本框中输入字符串?是否被禁用了?