wanti 发表于 2004-11-4 10:14:06

[请教]怎样让一个弹出的窗口始终保持在最上面

在测试中有一个弹出窗口,是非模态的,窗口也不大。有的时候,它会自动地被别的窗口覆盖。,这样就没有办法让他始终保持在最上面。
谢谢

pcl2004_27 发表于 2004-11-4 11:09:59

用API可以实现
SetWindowPos函数功能是将一个窗口在三维空间中移动,利用它,你可以改变一个窗口的位置,甚至可以在Z轴上改变(Z轴决定了一个窗口和其它窗口的前后关系),你还可以改变窗口的尺寸。为了实现TopMost类型的窗口,我们只需调用该函数,将窗口放在所有窗口的前面并永远保持在最前面即可。要想在SQABasic中使用SetWindowPos函数,必须进行如下的函数声明:
Declare Function SetwindowPos Lib "user32.dll" (ByVal hwnd As Long,ByVal hWndInsertAfter As Long,ByVal x As Long,ByVal y As Long,ByVal cx As Long,ByVal cy As Long,ByVal wFlags as Long)As Long

SetWindowPos函数各个参数的含义见表1。
表1 SetWindowPos函数的参数解释

参数名 参数含义
hwnd 要移动的窗口的句柄(可以用窗体的hwnd属性)
hWndInsertAfter 关于如何在Z轴上放置窗口的标记(具体见表2)
x 相当于窗口的Left属性
y 相当于窗口的Top属性
cx 相当于窗口的Right属性
cy 相当于窗口的Bottom属性
wFlags 关于如何移动窗口的标记(具体见表3)

表2 HWndInsertAfter参数的可能取值及含义

hWndInsertAfter的可能取值 功能
某一窗口的句柄 将窗口放在该句柄指定的窗口后面
HWND_BOTTOM(1) 把窗口放在Z轴的最后,即所有窗口的后面
HWND_TOP(0) 将窗口放在Z轴的前面,即所有窗口的前面
HWND_TOPMOST(-1) 使窗口成为“TopMost”类型的窗口,这种类型
的窗口总是在其它窗口的前面,真到它被关闭
HWND_NOTOPMOST(-2) 将窗口放在所有“TopMost”类型
窗口的后面、其它类型窗口的前面

表3 wFlags参数的可能值及含义

wFlags参数的可能值 功能
SWP_DRAWFRAME(&H20) 移动窗口后重画窗口及其上的所有内容
SWP_HIDEWINDOW(&H80) 隐藏窗口,窗口隐藏后既不出现在屏幕上也不出现在任
务栏上,但它仍然处于激活状态
SWP_NOACTIVATE(&H10) 窗口移动后不激活窗口,当然,如果窗口在移动前就是
激活的则例外
SWP_NOCOPYBITS(&H100) 当窗口移动后,不重画它上面的任何内容
SWP_NOMOVE(&H2) 不移动窗口(即忽略X和Y参数)
SWP_NOSIZE(&H1) 不改变窗口尺寸(即忽略Cx和Cy参数)
SWP_NOREDRAW(&H8) Do not remove the image of the window in its former position
from the screen. In other words,leave behind a ghost image
of the window in its old position
SWP_NOZORDER(&H4) 不改变窗口听Z轴位置(即忽略hWndInsertAfter参数)
SWP_SHOWWINDOW(&H40) 显示窗口(之前必须使用过SWP_HIDEWINDOW
隐藏窗口)
前面已提到,利用SetWindowPos函数可以决定窗口在Z轴中的位置,具体如何放置,需根据表2给hWndInsertAfter参数赋予合适的值。
   另外,wFlags参数为SetWindowPos函数移动窗口提供了附加的特性,我们可以通过or运算将表3中若干个wFlags结合在一起使用,如SWP_NOMOVE Or SWP_NOSIZE既不移动窗口又不改变窗口的尺寸。但是要注意不要将功能冲突的值结合使用,如SWP_HIDEWINDOW Or SWP_SHOWWINDOW。


Findwindow()函数用法

要使用此函数,先从API VIEW中拷贝如下的FindWindow()函数的声明:

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时 候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,所以应使用标题进行搜索。但有些软件的标题是不固定的,如一些MDI程序,如果打开的文 件不同,窗口标题也不同,这时使用窗口类来搜索就比较方便。如果找到了满足条件的窗口,这个函数会返回该窗口的句柄,否则返回0。前面提到的VB的FindWindow()函数的声明将两个参数都定义为String类型,而在实际使用过 程中,如果我们要忽略某个参数,应将该参数的定义由As String改为As Any。这里的As Any相当 于C语言中的强制类型转换。例如,如果我们忽略窗口的类,应将定义修改如下:

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal

lpClassName As Any, ByVal lpWindowName As String) As Long



例子:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long,ByVal hWndInsertAfter As Long,ByVal x As Long,ByVal y As Long, ByVal cx As Long, ByVal cy As Long,ByVal wFlags As Long) As Long

Const SWP_NOMOVE= &H2 '不移动窗体
Const SWP_NOSIZE=&H1 '不改变窗体尺寸
Const Flag=SWP_NOMOVE Or SWP_NOSIZE
Const HWND_TOPMOST=-1 '窗体总在最前面
Const HWND_NOTOPMOST=-2 '窗体不在最前面
为窗体添加代码如下:
main()
   dim hwnd aslong
   '用另一个api函数得到窗口的hwnd(函数:findWindow)

   hwnd = FindWindow(0&, "你的窗口名字")
   SetWindowPos hwnd ,HWND_TOPMOST,0,0,0,0,Flag
   脚本处理
End Sub

备注:以上脚本没有经过验证,请自行调试

不好意思 ,我用robot来实现,winRunner实现你琢磨一下!
主要就是findwindow 和 setwindowpos的应用,在winrunner中加载该函数就可以了

girl04 发表于 2004-11-4 11:30:40

版主,好劲呀,支持一下

QA_BAY 发表于 2004-11-4 13:23:24

哇,利害,版应该多一点出来解决问题,
我顶

wanti 发表于 2004-11-5 08:49:43

太感谢了,不过,这些方法也太深奥了

生如火花 发表于 2004-11-23 21:02:34

学习

hihihaha910 发表于 2005-8-15 19:02:29

厉害厉害,佩服佩服!

fly 发表于 2005-8-31 15:54:45

没有VB不行吧?
页: [1]
查看完整版本: [请教]怎样让一个弹出的窗口始终保持在最上面