[英]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.