当前位置:编程学习 > VB >>

如何获得窗体的创建时间

目前通过FINDWINDOW()获取窗口并返回窗口句柄,但是如果两个窗口的类名和标题相同的话会返回两个句柄,无法将句柄对应到相应的窗口上。现在想把两个句柄区分开,现在想个办法就是获取两个窗口的创建时间,但是查找API并没有返回窗口创建时间的函数,求助提供获取时间API的函数,或者有更好的办法区分两个句柄分别属于哪个窗口的,100分送上,谢谢 --------------------编程问答-------------------- 不清楚有没有这样的API.

不过可以提供一个思路给你:

你可以继续列举句柄的子窗体,然后匹配一下子窗口的位置.

比如A窗体在100,80处有一个类名为"Button"的控件,而B窗体要么没这个控件,要么位置不对.....

这样的话,除非两个窗体一模一样,不然肯定能分别出来. --------------------编程问答-------------------- 我继续说:除了根据位置判断外,还可以根据窗口大小或者活动窗口来判断!
如果是动态创建的窗口,可以记录一下创建时间! --------------------编程问答-------------------- 会有一模一样窗口的可能,因为是用来做自动化测试,很可能打开完全一样的两个窗口。2楼说的记录创建时间是如何操作,因为两个窗口会是同一个按钮点击产生的,我现在就想获取这个窗口创建的时间,但是没有找到相关的API函数,现在两个窗口的句柄是已知的,但如何通过句柄查询创建的时间就不知道了 --------------------编程问答-------------------- 既然是通过点击按钮创建的2个窗口,创建的时间肯定不一样。设置一个全局数组变量用来记录每一次创建的时间:
'放在标准模块中,每次创建时间都保存在数组中。
public CreateWindowTime(10) as long'最多点击10次 ,如果只点击2次,那设2就可以了。
--------------------编程问答-------------------- 要区别的话..你可以在窗口名称上做手脚..NewForm1..NewForm2..NewForm3这样...
要是嫌太难看..你就在窗口上放个text..然后 可见=fales.....然后在创建的时候.把创建的窗口号放进去..
然后用FINDWINDOW()找到窗口句柄后,就去读取那个控件text里面的值..然后就知道哪个先哪个后了...

噢噢..忘记说正题了..你说的那个看创建时间的API我米有见过..如果你见过发我下...谢谢 --------------------编程问答-------------------- 我看没有你所谓的"窗体创建时间"一说.....

有个变通方案,就是利用一个后台程序记录当前系统所有窗体的创建情况...然后作处理.

具体可以参考暴风雨老大的方案:

http://www.cnblogs.com/rainstormmaster/archive/2006/01/24/322759.html --------------------编程问答-------------------- 如果是自己的窗体应该不用这么麻烦

估计楼主要的是别的进程的窗体. --------------------编程问答--------------------

'在新窗口写上
Private Sub Form_Load()
Me.Caption = "XXXX" & "  " & Now
主窗口.List1.Add Me.Caption
End Sub

Private Sub Form_UnLoad()
Dim i As Integer 
For i = 0 To 主窗口.List1.ListCount -1
 If主窗口.List1.List(i) = Me.Caption then
  主窗口.List1.RemoveItem i
 End If
next i
End Sub
'这是在窗口名字上做手脚的办法..如果嫌不美观..就像上面所说..加个隐藏起来的text
--------------------编程问答-------------------- 如果这两个窗口不在同一个进程就可以用API获取窗体的内核时间,来判断。

用GetWindowThreadProcessId 获取窗体的线程ID
用OpenThread()获得线程句柄
然后用GetThreadTimes获得线程的内核时间,

内核时间大的肯定就是先创建的。 --------------------编程问答--------------------
引用 9 楼 bdzwj 的回复:
如果这两个窗口不在同一个进程就可以用API获取窗体的内核时间,来判断。 

用GetWindowThreadProcessId 获取窗体的线程ID 
用OpenThread()获得线程句柄 
然后用GetThreadTimes获得线程的内核时间, 

内核时间大的肯定就是先创建的。

我之前也想过,但如果要判断的两个窗体是同一线程的呢?

这个问题比较有意思,关注一下. --------------------编程问答-------------------- 关注        --------------------编程问答-------------------- 可以用spy++等查看一下窗体之间的不同信息,然后自己获得以后,再区分 --------------------编程问答-------------------- 用SetWindowsHookEx可以得知创建窗口,取当前时间并记录。
目前对你的需求还不是很清楚,感觉应该不需要这么复杂。如果要把一个程序加载多次,根据窗口所属的进程ID即可区分;另外,新窗口的创建应该是由你的程序间接控制的,你可以在每次控制创建新窗口后FindWindow,如果担心重复,可以与前面已创建的窗口句柄对比。 --------------------编程问答-------------------- chenjl1031 的回答我们当时也有同样的想法,就是设置一把全局变量来保存,但是我们的测试框架是要中途停下拉进行调试的,再次运行的话全局变量会被清空,用文件保存的话就太麻烦了,有些得不偿失,希望能找到更简洁的方法来判断

cih2000zg myjian 的回答:我们在做自动化测试,即被测软件的标题我们是不能去更改的。

bdzwj 的方法可以试试,但是也有同myjian同样的顾虑,我们这边会尝试下看能否解决

oyljerry 的方法,两个窗口是一模一样的窗口,跟QQ一样,你可以同时打开两个联系人窗口,但这两个窗口的标题是一致的,简单点说就是我有两个昵称一样的好友,我现在同时打开这两个好友聊天窗口,我怎么去区分呢。

cnzdgs 的第一种方法采用钩子,想找个比较简单的方式来实现。第2钟方法也跟chenjl1031一样,没有办法保存这个临时的值。

窗口的创建及销毁是由自己的生命周期的,系统应该会有记录,但不知道有没有办法获取,请各位大虾继续发挥自己的聪明才智,希望尽快解决这个问题。
--------------------编程问答-------------------- 刚看了bdzwj的方法,两个窗口肯定是在同一个进程的,否则通过PID就可以区分了,我们自己有封装FindWindowWithPID的函数 --------------------编程问答-------------------- 既然做测试,让操作员自己决定选那个窗口好了。
你可以显示一个ListBox,用户选择一个项目就用 FlashWindow 标记一下窗口,让用户来确定选哪个。 --------------------编程问答--------------------
引用 13 楼 cnzdgs 的回复:
用SetWindowsHookEx可以得知创建窗口,取当前时间并记录。 
目前对你的需求还不是很清楚,感觉应该不需要这么复杂。如果要把一个程序加载多次,根据窗口所属的进程ID即可区分;另外,新窗口的创建应该是由你的程序间接控制的,你可以在每次控制创建新窗口后FindWindow,如果担心重复,可以与前面已创建的窗口句柄对比。


高招,果然是有一个API可以记录! --------------------编程问答--------------------
引用 14 楼 jimmy_zhou 的回复:
chenjl1031 的回答我们当时也有同样的想法,就是设置一把全局变量来保存,但是我们的测试框架是要中途停下拉进行调试的,再次运行的话全局变量会被清空,用文件保存的话就太麻烦了,有些得不偿失,希望能找到更简洁的方法来判断 

cih2000zg myjian 的回答:我们在做自动化测试,即被测软件的标题我们是不能去更改的。 

bdzwj 的方法可以试试,但是也有同myjian同样的顾虑,我们这边会尝试下看能否解决 

oyljerry 的方法…


标准模块中的全局变量生命周期是最长的,只要进程没有终止,是可以保存的.这样可以简单化。 --------------------编程问答-------------------- 怎么没有人回答了,自己顶下 --------------------编程问答-------------------- up --------------------编程问答-------------------- 如果你是访问的是人家的窗口,,由于我暂时还米有发现楼主说的API,,我认为只有通过监控来实现。。
用一个timer控件,不断的进行findwindow。。如果有找到,把.hWnd的窗口句柄用Now()记录并放入list里


Private sub timer1_timer
dim hwindow
dim i
set hwindow = nothing
i=0
hwindow= FindWindow(XXX, XXX)
if hwindow<>0 then
for i=0 to list1.count-1
 if list1.list(i) = hwindow then exit sub
next i
list1.add hwindow
list2.add hwindow & now
end sub
--------------------编程问答-------------------- 我还是不知道有那个API。。所以我只能想那些偏门。。楼猪莫怪哈。。 --------------------编程问答-------------------- 没关系,大家研究嘛,其实我们的方法是打开第一次窗体是调用下FindWindow并记录该窗口的句柄,再打开第2个窗口再调用次FindWindow记录这两个窗口的句柄,第2个值减去第一个值就是第2个窗口的句柄了,但是这个东西要在脚本中来时间,增加了脚本编写的复杂度,现在想找个好点的方法来在测试框架中实现,如果实在没有办法,只能采取刚刚的办法了 --------------------编程问答--------------------
引用 14 楼 jimmy_zhou 的回复:
chenjl1031 的回答我们当时也有同样的想法,就是设置一把全局变量来保存,但是我们的测试框架是要中途停下拉进行调试的,再次运行的话全局变量会被清空,用文件保存的话就太麻烦了,有些得不偿失,希望能找到更简洁的方法来判断

cih2000zg myjian 的回答:我们在做自动化测试,即被测软件的标题我们是不能去更改的。

bdzwj 的方法可以试试,但是也有同myjian同样的顾虑,我们这边会尝试下看能否解决

oyljerry 的方法,两…


你可以利用ATOM将你的信息保存到窗体句柄, 用SetProp()保存,GetProp()读取进行比对。 --------------------编程问答-------------------- 我看还是只有监视+判断的方案....

对于已经存在的窗体,想要判断哪个先启动哪个后启动,貌似真没啥办法..... --------------------编程问答-------------------- 9 ,13 ,21楼的楼主都可以参考。。。 --------------------编程问答-------------------- 学习。
6楼回复链接强大。 --------------------编程问答-------------------- --------------------编程问答-------------------- 挂WH_CALLWNDPROC钩子,监视WM_CREATE消息,记录下时间即可。 --------------------编程问答-------------------- 如果没有人工干预,先后弹出的两个窗口在 EnumWindows 中有固定的前后次序的。
如果可以人工干预,如16楼所言,自己选一个。 --------------------编程问答--------------------
引用楼主 jimmy_zhou 的回复:
目前通过FINDWINDOW()获取窗口并返回窗口句柄,但是如果两个窗口的类名和标题相同的话会返回两个句柄,无法将句柄对应到相应的窗口上。现在想把两个句柄区分开,现在想个办法就是获取两个窗口的创建时间,但是查找API并没有返回窗口创建时间的函数,求助提供获取时间API的函数,或者有更好的办法区分两个句柄分别属于哪个窗口的,100分送上,谢谢


句柄大小是否能区分一下呢? --------------------编程问答-------------------- ding ding --------------------编程问答-------------------- 监视 A 程序的 a 窗口的创建时间

如果 A.a 先于自己的程序启动.... 貌似无解....


如果 A.a 后于自己启动, 可以用hook GetMessage 的类似办法实现
补充:VB ,  API
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,