1. 程式人生 > 其它 >將 Winform 窗體置頂顯示的解決方法

將 Winform 窗體置頂顯示的解決方法

技術標籤:C#

Winform 視窗有一個屬性:TopMost,表示該窗體是否始終顯示在此屬性未設定為 true 的所有其他窗體之上;

我的理解就是,如果一個 Winform 專案有多個窗體,其中有一個窗體的 TopMost 屬性設為 true 了,而其他窗體的 TopMost 未設定為 true,那麼 TopMost 屬性為 true 的窗體就會顯示在其他窗體之上;

前幾天專案上遇到一個問題:我明明設定了窗體的 TopMost 屬性為 true,還是無法顯示在最上層;

後來經過反覆測試,發現一個情況:如果我只在窗體屬性欄上設定 TopMost 為 true,窗體無法置頂顯示:

如果沒有把窗體屬性欄上的 TopMost 設定為 true(預設為 false),而是在窗體的 Load 事件中用程式碼指定 TopMost=true,也無法置頂顯示:

但是,當我同時在窗體屬性欄上設定 TopMost 為 true,也在 load 事件裡用程式碼指定 TopMost=true,就可以將窗體置頂顯示。

但是,後來我再用這種方式置頂窗體,發現又不靈了。

在網上查了各種資料,我自己也測試了各種情況,最後發現,當我把窗體的 ShowInTaskbar 屬性設定為 false,又可以置頂了。

也就是把 ShowInTaskbar 屬性設定為 false,把 TopMost 屬性設定為 true,也在 load 方法裡用程式碼指定 TopMost=true,三個條件一起滿足的情況下,窗體又可以置頂了。

在網上還查到另一種使用系統動態庫的方法置頂窗體(不用把 ShowInTaskbar 屬性設定為 false):

把窗體的 TopMost 屬性設定為 true,同時在程式碼里加如下內容:

// 設定此窗體為活動窗體:
// 將建立指定視窗的執行緒帶到前臺並激活該視窗。鍵盤輸入直接指向視窗,併為使用者更改各種視覺提示。
// 系統為建立前臺視窗的執行緒分配的優先順序略高於其他執行緒。
[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
 
// 設定此窗體為活動窗體:
// 啟用視窗。視窗必須附加到呼叫執行緒的訊息佇列。
[DllImport("user32.dll", EntryPoint = "SetActiveWindow")]
public static extern IntPtr SetActiveWindow(IntPtr hWnd);
 
// 設定窗體位置
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int Width, int Height, int flags);
private void Form2_Load(object sender, EventArgs e)
{
    // 設定窗體顯示在最上層
    SetWindowPos(this.Handle, -1, 0, 0, 0, 0, 0x0001 | 0x0002 | 0x0010 | 0x0080);
 
    // 設定本窗體為活動窗體
    SetActiveWindow(this.Handle);
    SetForegroundWindow(this.Handle);
 
    // 設定窗體置頂
    this.TopMost = true;
}

摘自:https://blog.csdn.net/qq_29331365/article/details/103290123