簡體   English   中英

VB.net 將 Window 帶到前面

[英]VB.net Bring Window to Front

VB.net 2010 中的什么代碼我需要設置一個 window 到屏幕前面。

我想要實現的是顯示一個緊急警報類型,它是一個表單,由於某些原因我沒有使用消息框。

有人建議了以下代碼,但這不起作用:

  Private Sub frmMessage_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.BringToFront()
    End Sub

設置 window 的屬性TopMost就足夠了,您需要在其他對象之上。

Form.TopMost = True

嘗試

me.Activate()

這不能解決問題

編輯:我用谷歌搜索找到我的答案的備份

我的情況

編輯2:

似乎有幾件事有效。 以上以及

''depending on setup
Me.Show
Form2.Show()

Form2.ShowDialog()

Form2.Visible = True
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindow( _
     ByVal lpClassName As String, _
     ByVal lpWindowName As String) As IntPtr
End Function

<DllImport("user32.dll")> _
Private Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

現在,取您想要放在前面的 window 的名稱,然后執行以下操作:

string name = "Untitled - Notepad";
IntPtr ptr = FindWindow(null, name);
SetForegroundWindow(ptr);

這會將 window 帶到屏幕的前面。

如果您想要的是在 winfom 失去焦點或已最小化之后帶來的結果。 就我而言,當我在一個按鈕上打開一個 winform 時工作。

    frmProducts.Show()
    'Retorre the original State
    frmProducts.BringToFront()
    frmProducts.WindowState = FormWindowState.Normal

嘗試使用.Shown 事件 這是一個三表格測試的代碼。 在按鈕單擊事件結束時,Form3 應位於 Form2 之上,Form1 之上。

Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Me.SendToBack()
        Dim f2 As New Form2
        f2.Show()
        Dim f3 As New Form3
        f3.Show()
    End Sub
End Class

Public Class Form2
    Private Sub Form2_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        Me.BringToFront()
    End Sub
End Class

Public Class Form3
    Private Sub Form3_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        Me.BringToFront()
    End Sub
End Class

從哪里把 window 帶到前面?

計量吸入器

在具有多個 forms 的 MDI 中, form.BringToFront()就足夠了,這會將表單移動到應用程序的頂部。 您還可以在顯示警告/錯誤時使用form.ShowDialog()方法。

桌面

在您的桌面上,您可能有多個應用程序,最好 go 將應用程序設置為 TopMost。

如果您的應用程序位於另一個 windows 之后,則可能看不到警告消息。

要將application放在前面,您需要做一些額外的工作,這是對“表單”class 的“擴展”,因此使用如下: form.MakeTopMost()

<Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
Private Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
End Function

Private ReadOnly HWND_TOPMOST As New IntPtr(-1)
Private ReadOnly HWND_NOTOPMOST As New IntPtr(-2)

<System.Runtime.CompilerServices.Extension()> _
Public Sub MakeTopMost(frm As Form)
    SetWindowPos(frm.Handle(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

<System.Runtime.CompilerServices.Extension()> _
Public Sub MakeNormal(frm As Form)
    SetWindowPos(frm.Handle(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

與往常一樣,擴展代碼需要位於單獨的模塊中。

我的要求是彈出一個可能最小化的應用程序並將其最大化和激活。 在網上搜索了一下之后,我在 c++ 論壇中找到了部分答案。

WindowState = FormWindowState.Maximized
Me.Activate()

這將我的應用程序用於任何 state(最大、迷你、大、小、后面的東西)。 它把它帶到前面並在屏幕上最大化。 即在屏幕上彈出它,所以我可以看到它!

如果沒有任何效果,請嘗試右鍵單擊並將 select 置於前面。 如果其他圖像覆蓋了必須在前面的圖像,只需右鍵單擊每個圖像,然后根據需要將 select 發送到后面。

我用:

dim tempResult as dialogResult = frmName.showDialog()

並以被調用的形式:

me.dialogResult = dialogResult.{OK, Abort, whatever}

調用表單代碼在繼續執行之前等待被調用的 forms 結果。

只需設置要顯示在頂部的表單的Owner屬性:

Dim frmMessage As New Form()
frmMessage.Owner = frmMain   'frmMain is the form creating the message window
frmMessage.Show()

現在frmMessage將始終位於frmMain之上,無論焦點如何。

正如另一位用戶發布的那樣,我最喜歡的方法之一是設置 forms 所有者。 通過這樣做,當任一表單被聚焦、激活等時,子表單將始終位於父表單之上。這樣做的好處是您不必捕獲任何特殊事件並執行任何特殊代碼。 假設您有一個主窗體 frmMain 和一個彈出窗體 frmPopup,您可以使用以下代碼來確保彈出窗口始終位於主窗體的頂部,而無需使用 topmost(這可行,但可能會產生一些不好的副作用)。

frmPopup.show(frmMain)

或者您可以使用更長的版本(如上面某人發布的那樣

frmPopup.Owner = frmMain
frmPopup.show()

另一件很棒的事情是您也可以將它與 ShowDialog() 一起使用

frmPopup.ShowDialog(frmMain)

我知道這是一篇舊帖子,但也許仍在尋找簡單解決方案的人會發現這一點。 與我以前使用的代碼相比,它確實有助於改進我的程序的功能。

從屏幕上繪制一個可見的最頂部窗體,然后使該窗體成為 ShowDialog() 調用的所有者。

我知道這有點舊,但我今天遇到了類似的問題,這就是我解決它的方法。 只要您不介意關閉打開的表單並創建一個新表單,它就可以工作。

 Dim MyRemoteForm As New Form
    MyRemoteForm = Application.OpenForms("frmManualRemote")
    If MyRemoteForm Is Nothing Then
        frmManualRemote.Show()
    Else
        frmManualRemote.Close()
        frmManualRemote.Show()
    End If

有點偏離 OP... 我有一個從菜單打開的“儀表板”。 用戶可以切換到其他 windows 然后再次“加載”儀表板。 如果它已經加載,它會被帶到前面。

聲明 frmFISDash = frmFISDashboard "global"

    If frmFISDash Is Nothing Then
        frmFISDash = New frmFISDashboard
        frmFISDash.Show()
    Else
        frmFISDash.WindowState = FormWindowState.Normal
        frmFISDash.BringToFront()
    End If

注意 .WindowsState 的設置 - 如果表單被最小化。bringToFront 不起作用。

我以這種方式解決了它(我對某人有用)-即使在調試模式下,它也會將隱藏的表單帶到前面:

Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) Handles MyBase.SizeChanged
    If Me.WindowState = FormWindowState.Minimized Then
        HideForm()
    Else
        BringFormToFront()
    End If
End Sub


Private Sub NotifyIcon_Click(sender As Object, e As EventArgs) Handles NotifyIcon.Click
    'Determine which mouse button was pressed, in order to differentiate between Left/Right Mouse Button
    Dim MouseButton As System.Windows.Forms.MouseEventArgs = CType(e, MouseEventArgs)
    If MouseButton.Button = MouseButtons.Left Then
        BringFormToFront()
    End If
End Sub

Private Sub NotifyIcon_DoubleClick(sender As Object, e As EventArgs) Handles NotifyIcon.DoubleClick
    BringFormToFront()
End Sub

Private Sub HideForm()
    Me.NotifyIcon.Visible = True
    Me.ShowInTaskbar = False
    'Windowstate controlled by user when minimizing Form
   Msgbox("Minimized, click on Notify Icon to show")
End Sub

Private Sub BringFormToFront()
    Me.NotifyIcon.Visible = False
    Me.ShowInTaskbar = True
    Me.WindowState = FormWindowState.Normal
End Sub

根據他的描述采取吉姆諾蘭所說的去做。 這是確保表單正確位於所有其他 forms 前面以及處理表單、分配新表單的所有權和顯示表單的最佳處理方式

Dim form As Form = new Form
form.TopMost = True
form.Owner = Me
form.ShowDialog()
form.Dispose()

在單擊菜單選項后,以下對我來說似乎最容易調出一個名為“項目”的表單。 如有必要,將加載表格,如有必要,將其最小化,並放在前面(“焦點”)。

Private Sub ProjectsToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles ProjectsToolStripMenuItem1.Click

    Me.Cursor = Cursors.WaitCursor       ' if form is slow to load for any reason
    Projects.Show()
    Me.Cursor = Cursors.Default
    Projects.WindowState = FormWindowState.Normal
    Projects.Focus()

End Sub

表單加載時請參見以下示例

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Me.TopMost = True

End Sub

嘗試這個:

Me.ShowDialog()

應該有幫助。

一個小技巧:

me.hide()
me.visible = true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM