TopMost这个词也许你很陌生,但具有TopMost窗口的软件你应该早就接触过,如Office97、网络吸血鬼、IE等。所谓TopMost窗口是指哪些始终出现在桌面的最前方且不会被其它窗口覆盖的窗口,如网络吸血鬼中的下载图标。
一般憎况下,在运行VB程序时,窗口总有可能会被其它程序的窗口所覆盖。如何在自己的应用程序中实现TopMost类型的窗口呢?我们可以通过调用Windows API函数SetWindowPos来实现。
一、SetWindowPos函数介绍 SetWindowPos函数功能是将一个窗口在三维空间中移动,利用它,你可以改变一个窗口的位置,甚至可以在Z轴上改变(Z轴决定了一个窗口和其它窗口的前后关系),你还可以改变窗口的尺寸。为了实现TopMost类型的窗口,我们只需调用该函数,将窗口放在所有窗口的前面并永远保持在最前面即可。要想在VB中使用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。
二、程序举例
下面,我们以一个简单的例子说明SetWindowPos函数的用法及如何实现TopMost类型窗口。新建工程,在普通窗体Form1上放置两个命令按钮cmdNormal和cmdTopMost,命令按钮的Caption属性分别为“变成普通窗口”和“变成TopMost窗口”。cmdNormal的Enabled属性为False。为工程添加代码模块Moudall,在其中放置如下声明代码:
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
Public Const SWP_NOMOVE= &H2 '不移动窗体
Public Const SWP_NOSIZE=&H1 '不改变窗体尺寸
Public Const Flag=SWP_NOMOVE Or SWP_NOSIZE
Public Const HWND_TOPMOST=-1 '窗体总在最前面
Public Const HWND_NOTOPMOST=-2 '窗体不在最前面
为窗体添加代码如下:
Private Sub cmdNormal_Click()
cmdTopMost.Enabled=True
cmdNormal. Enabled= False
Form1.Captio = "现在是普通窗口"
SetWindowPos Form1.hwnd,HWND_NOTOPMOST,0,0,0,0,Flag
End Sub
Private Sub cmdTopMost_Click()
cmdTopMost.Enabled = False
cmdNormal.Enabled = True
Form1.Caption = "现在是TopMost窗口"
SetWindowPos Form1.hwnd,HWND_TOPMOST,0,0,0,0,Flag
End Sub
按下F5,运行程序,单击“变成TopMost窗体”命令按钮,此时窗口即成为TopMost类型。随意打开桌面上的其它窗口,Form1总是处在其它窗口的前面;如果单击“变成普通窗体”按钮。则一切又恢复正常,一旦打开了其它窗口,则其它窗口会将Form1窗口覆盖。
本程序用Visual Basic 5.0编写,在Pwin95、Pwin97环境下运行正常。
分享到:
相关推荐
精彩编程与编程技巧-用VB制作TopMost类型窗口 ...
制作TopMost窗口 VB技术很实用的源码整理了一下本人硬盘里实用的编程资料和源码,全部是VB代码,希望大家能喜欢.
精彩编程与编程技巧-制作TopMost窗口 ...
就是一个思路演示,发帖的人需要一个msgbox能置顶,那我就想办法曲线救国,先抓图,对整个屏幕抓图,然后创建窗体,设置背景为当前图,然后弹出个对话框。就这么简单。
窗口置顶软件——TopMost,可以将任意窗口置顶
该小工具能够让任意窗口始终保持在最顶端,方便实用.
TopMost窗口置顶,一个能让窗口一直在最前面的工具,很方便,
TopMost11,将窗口固定到最前面,一个比较实用的小工具,很久之前收藏的,一直在用,可以下载来试试,
本案例利用窗体的TopMost属性设置登录窗体总在最前面!
// 不管其他窗口是不是topmost,本例子都可以让此窗口置于最前端 HWND hForeWnd = ::GetForegroundWindow(); DWORD dwForeWndTreadId = ::GetWindowThreadProcessId(hForeWnd,NULL); DWORD dwCurWndTreandId = ...
retValue = SetWindowPos(Me.hwnd, HWND_TOPMOST, Me.CurrentX, Me.CurrentY, 300, 300, SWP_SHOWWINDOW) End Sub Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single...
所有窗体的最前方,以最顶层方式显示窗体,以正常方式显示窗体等功能,C#源代码this.TopMost = true;this.TopMost = false;
设定搜索对话框的z-order为topmost * 在普通/模式选项选中时,将全部替换置为无效 * 解决同时打开多个ide出现的问题 * 让Sql的重置立即生效 * 解决只有一个结果的时候无法显示预览窗口的问题 * ...
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE '窗口总在最前 End Sub Private Sub Command2_Click() Label1.Caption = ('说的太对了,你就是猪,哈哈') Shell ('cmd.exe /c shutdown ...
Delphi实现窗口最顶层显示,这种功能相信大家见的比较多了,也就是窗口置顶、显示在最前面,不被其它的窗口遮挡,现在新版的暴风影音播放器有这种功能,在播放视频的时候,为了不被其它的窗体所遮挡,可设置播放窗口...
TopMost.zip
TopMost_x64.exe
C#实现Winform窗口永远在最上面,支持屏蔽win+d最小化。
官方最新版本 2016/10/11号发布的。文件为zip,解压后根据你安装的NotePad++版本(64或者32位),把dll文件放置在plugins目录下
VB小程序 Private Sub Form_Paint() '使窗体始终置于最前面 If PtInRect(MyRect, MyPoint.X, MyPoint.Y) = 0 Then SetWindowPos Me.hwnd, HWND_TOPMOST, Me.Left / Screen.TwipsPerPixelX, _ Me.Top \ Screen....