首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

获取程序外控件独一标示

2012-12-24 
获取程序外控件唯一标示用API如何获取程序外控件的唯一标示我用 GetWindowText + GetClassName + GetClien

获取程序外控件唯一标示
用API如何获取程序外控件的唯一标示

我用 GetWindowText + GetClassName + GetClientRect 任然不能确定唯一。

请问还有什么API能获取唯一标示?
[最优解释]
即EnumChildWindows获得到控件顺序。
[其他解释]
在我看来句柄就是控件的唯一标示,相当于人的身份证。
思路:
1、使用FindWindows获取目标控件所在窗体的句柄
2、使用FindWindowsEx继续查找该控件的句柄
[其他解释]


Option Explicit
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 Sub Command1_Click()
    Dim lngCalacHwnd As Long
    Dim lngButtonOneHwnd As Long
    Dim lngP As Long
    
    lngCalacHwnd = FindWindow(vbNullString, "计算器")
    If lngCalacHwnd = 0 Then Exit Sub
    lngButtonOneHwnd = FindWindowEx(lngCalacHwnd, 0, vbNullString, "1")
    Me.PSet (100, 100)
    Print "计算器窗口的句柄是:" & CStr(lngCalacHwnd)
    Print "按钮“1”的句柄是:" & CStr(lngButtonOneHwnd)
End Sub



[其他解释]
句柄是唯一标示,可是它是变化的,可能是我没表述清楚,我现在获取了目标软件的所有控件句柄,但是没法知道这个句柄是哪个文本框的
[其他解释]
分析父窗体不行,因为有一个父窗体下有5个文本框的所有GetWindowText + GetClassName + GetClientRect 值都是一样的
[其他解释]
引用:
句柄是唯一标示,可是它是变化的,可能是我没表述清楚,我现在获取了目标软件的所有控件句柄,但是没法知道这个句柄是哪个文本框的

可以说是变化的,但其在其“生命期”内是不会变化的。对于Windows而言,它只会认句柄的。
[其他解释]
引用:
分析父窗体不行,因为有一个父窗体下有5个文本框的所有GetWindowText + GetClassName + GetClientRect 值都是一样的

对于没有文字标示的多个相同类型的控件,我的确暂时无法帮助你区分。先研究下。
[其他解释]
几个文本框在父窗体内的排放位置应该有规律吧?
用 GetWindowRect 取得每个文本框的位置,按照坐标排序,不就可以区分第几个了。
[其他解释]
引用:
几个文本框在父窗体内的排放位置应该有规律吧?
用 GetWindowRect 取得每个文本框的位置,按照坐标排序,不就可以区分第几个了。


请看我的问题描述,我已经使用了3个API去分析,已经包括了你说的GetWindowRect

坐标值是一模一样的这个我也很奇怪,不明白写代码的是怎么弄的

谁帮我解决了这个问题,我所有的分都给他
[其他解释]
既然是同一个位置,人工都无法分辨哪个是哪个,就无法定义规则来进行编程。
[其他解释]
用FindWindowEx可以找到这五个文本框,那么可以利用FindWindowEx的第二个句柄参数,依次顺序找到这五个文本框。并且这个顺序在每一次父窗口加载后,每个文本框对应的顺序还是一样的。
所以可以利用FindWindowEx找到第一个文本框的句柄hWnd1,
然后将hWnd1作为FindWindowEx的第二个参数,能找到对应的第二个文本框。



[其他解释]
hWnd就是唯一标示
[其他解释]
HOOK CreateWindow 
[其他解释]
FindWindowEx、EnumChildWindows 都是按照 Z-Order 次序遍历的,在没有确定 Z-Order 不变的前提下,子窗口的次序不能作为唯一标识。
[其他解释]

引用:
引用:
几个文本框在父窗体内的排放位置应该有规律吧?
用 GetWindowRect 取得每个文本框的位置,按照坐标排序,不就可以区分第几个了。


请看我的问题描述,我已经使用了3个API去分析,已经包括了你说的GetWindowRect

坐标值是一模一样的这个我也很奇怪,不明白写代码的是怎么弄的

谁帮我解决了这个问题,我所有的分都给他……

怎么是同一位置啊,重合了。那后面的怎么看啊?

[其他解释]
这个问题让人纠结
[其他解释]
怎么是同一位置啊,重合了。那后面的怎么看啊?

从界面上看空间是不在同一位置的。但是用API获取的值来看就是一样的。可惜不能贴图,否则给你们看一下。

我目前的做法就是根据获取句柄的顺序来给他们标号,然后在根据这个标号来确定唯一。

但是这个做法毕竟不能放心。万一顺序变化了,那值就全错位了
[其他解释]
程序运行会调用CreateWindow函数创建窗体等,自己钩一下就明白了
[其他解释]
继续等待各位牛人想想办法
[其他解释]
不能按坐标,控件可以移动,或有滚动条都完蛋。
也不能用句柄,每次启动程序的句柄不一样。
用控件创建的顺序,它是唯一的。
[其他解释]
引用:
即EnumChildWindows获得到控件顺序。

是啊,我现在就是以顺序来判断,已经没辙了,分都给你吧

热点排行