标题: [请教]怎样让一个弹出的窗口始终保持在最上面 [打印本页] 作者: wanti 时间: 2004-11-4 10:14 标题: [请教]怎样让一个弹出的窗口始终保持在最上面 在测试中有一个弹出窗口,是非模态的,窗口也不大。有的时候,它会自动地被别的窗口覆盖。,这样就没有办法让他始终保持在最上面。
谢谢作者: pcl2004_27 时间: 2004-11-4 11:09
用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)
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
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 as long
'用另一个api函数得到窗口的hwnd(函数:findWindow)
hwnd = FindWindow(0&, "你的窗口名字")
SetWindowPos hwnd ,HWND_TOPMOST,0,0,0,0,Flag
脚本处理
End Sub