如何讓窗體總在桌面最前面顯示

2021-04-14 19:02:09 字數 4000 閱讀 6213

呼叫api函式setwindowpos可達到這一目的。該函式的語法是:

setwindowpos hwnd, hwndinsetafter, x, y, cx, xy, wflags

其中:

hwnd ---- 窗體的控制代碼(handle)。

hwndinsetafter ---- 它就是決定是否「總在前」的引數,

應用中設定為: hwnd_topmost      總在前

hwnd_notopmost   正常的

x,y,cx,cy ----表示窗體的位置和大小的引數,在實際應用中可忽略。

wflags ---- 決定窗體是否可以移動和改變尺寸,

一般設定成這樣的形式: swp_nomove or swp_nosize。

使用api函式之前必須先在程式中宣告如下:

private 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

其中各引數的意義如下:

引數 意義

hwnd long 欲定位的視窗

hwndinsertafter long 視窗控制代碼。在視窗列表中,視窗hwnd會置於這個視窗控制代碼的後面

x,y long 視窗新的x,y座標

cx,cy long 指定新的視窗寬度和高度

wflags long 包含了旗標的乙個整數,是下列之一

返回值 long 非零表示成功,零表示失敗

下面是部分wflags引數和它們的意義:

引數 意義和使用方法

swp_drawframe 圍繞視窗畫乙個框

swp_hidewindow 隱藏視窗

swp_noactivate 不啟用視窗

swp_nomove 保持當前位置 (x和y設定將被忽略) &h2

swp_noredraw 視窗不自動重畫

swp_nosize 保持當前大小 (cx和cy會被忽略) &h1

swp_nozorder 保持視窗在列表的當前位置 (hwndinsertafter將被忽略)

swp_showwindow 顯示視窗 &h40

swp_framechanged 強迫一條wm_nccalcsize訊息進入視窗,即使視窗的大小沒有改變

函式的使用很簡單,我們只須在form_load中加入如下語句即可:

retvalue = setwindowpos(me.hwnd, hwnd_topmost, me.currentx, me.currenty, 300, 300, swp_showwindow)

這樣窗體就能保持在所有窗體的前面了。

為了學習方便,下面提供了原始碼:

注釋:-------------------------------------------

注釋: 讓乙個窗體總是處於最前的例子

注釋:-------------------------------------------

注釋:程式說明:

注釋:本例應用setwindowpos函式,設定窗體的顯示屬性

注釋:來實現讓乙個窗體總是處於其他窗體的前面而不會

注釋:被其他窗體所遮住。

注釋:-------------------------------------------

option explicit

注釋:【vb宣告】

注釋: private 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

注釋:【說明】

注釋: 這個函式能為視窗指定乙個新位置和狀態。它也可改變視窗在內部視窗列表中的位置。該函式與deferwindowpos函式相似,只是它的作用是立即表現出來的(在vb裡使用:針對vb窗體,如它們在win32下遮蔽或最小化,則需重設最頂部狀態。如有必要,請用乙個子類處理模組來重設最頂部狀態

注釋:【返回值】

注釋: long,非零表示成功,零表示失敗。會設定getlasterror

注釋:【備註】

注釋: 視窗成為最頂級視窗後,它下屬的所有視窗也會進入最頂級。一旦將其設為非最頂級,則它的所有下屬和物主視窗也會轉為非最頂級。z序列用垂直於螢幕的一根假想z軸量化這種從頂部到底部排列的視窗順序

注釋:【參數列】

注釋: hwnd ----------- long,欲定位的視窗

注釋: hwndinsertafter - long,視窗控制代碼。在視窗列表中,視窗hwnd會置於這個視窗控制代碼的後面。也可能選用下述值之一:

注釋: hwnd_bottom 將視窗置於視窗列表底部

注釋: hwnd_top 將視窗置於z序列的頂部;z序列代表在分級結構中,視窗針對乙個給定級別的視窗顯示的順序

注釋: hwnd_topmost 將視窗置於列表頂部,並位於任何最頂部視窗的前面 -1

注釋: hwnd_notopmost 將視窗置於列表頂部,並位於任何最頂部視窗的後面 -2

注釋: x -------------- long,視窗新的x座標。如hwnd是乙個子視窗,則x用父視窗的客戶區座標表示

注釋: y -------------- long,視窗新的y座標。如hwnd是乙個子視窗,則y用父視窗的客戶區座標表示

注釋: cx ------------- long,指定新的視窗寬度

注釋: cy ------------- long,指定新的視窗高度

注釋: wflags --------- long,包含了旗標的乙個整數,是下列之一:

注釋: swp_drawframe 圍繞視窗畫乙個框

注釋: swp_hidewindow 隱藏視窗

注釋: swp_noactivate 不啟用視窗 &h10

注釋: swp_nomove 保持當前位置 (x和y設定將被忽略) &h2

注釋: swp_noredraw 視窗不自動重畫

注釋: swp_nosize 保持當前大小 (cx和cy會被忽略) &h1

注釋: swp_nozorder 保持視窗在列表的當前位置 (hwndinsertafter將被忽略)

注釋: swp_showwindow 顯示視窗 &h40

注釋: swp_framechanged 強迫一條wm_nccalcsize訊息進入視窗,即使視窗的大小沒有改變

private 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 hwnd_topmost = -1

const swp_showwindow = &h40

private sub form_load()

dim retvalue as long

注釋:將窗體設定為處於所有視窗的頂層,注意在 vb 中執行時,

』可能不行,但編譯成exe後就可以了

retvalue = setwindowpos(me.hwnd, hwnd_topmost, me.currentx,

me.currenty, 300, 300, swp_showwindow)

end sub

讓MessageBox在最前面顯示

用 引數messageboxtext 型別 system.string 指定文字顯示的 string caption 型別 system.string 指定標題欄宣告中顯示的 string button 型別 system.windows.messageboxbutton 指定的 messagebo...

如何讓視窗始終保持在最前面

如何讓視窗始終保持在最前面 飄飄白雲 20090110 問題 讓目標視窗始終保持在最前面,無論這個視窗是模式的還是模式的。思路 取得當前最前面視窗的title,如果title不是與目標視窗的title不相同 說明目標視窗不是在最前面 列舉視窗,找到目標視窗,設定它為最前面。說話 static wch...

利用托盤將最小化的窗體顯示在最前面

在論壇裡面看到說了很多方法,如 1 this.topmost true 讓程式窗體總在其他所有窗體的最上面 2 this.activate 3 this.bringtofront 4 dllimport user32.dll entrypoint setforegroundwindow public...