VB.net将窗口带到前面

时间:2011-07-18 18:43:29

标签: vb.net winforms

我需要在VB.net 2010中设置一个窗口来显示屏幕前面的代码。

我想要实现的是显示紧急警报类型,它是一种形式,由于某些原因我没有使用消息框。

有人建议使用以下代码,但这不起作用:

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

20 个答案:

答案 0 :(得分:20)

设置窗口的属性 TopMost 就足够了。

Form.TopMost = True

答案 1 :(得分:11)

me.Activate()

这个outta做的伎俩

编辑:我用谷歌搜索我的答案备份

My Case

EDIT2:

似乎有一些有用的东西。以上以及

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

Form2.ShowDialog()

Form2.Visible = True

答案 2 :(得分:6)

<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

现在,取出要带到前面的窗口的名称,然后执行以下操作:

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

这会将窗口置于屏幕的正面。

答案 3 :(得分:3)

尝试使用 .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

答案 4 :(得分:1)

从哪里把窗户带到前面?

MDI

在具有多种表单的MDI中,form.BringToFront()就足够了,这会将表单移到应用程序的顶部。 您还可以在显示警告/错误时使用form.ShowDialog()方法。

桌面

在桌面上,您可能有多个应用程序,最好将应用程序设置为TopMost。

如果您的应用程序位于其他窗口后面,则警告消息可能不可见。

要将application置于最前面,您需要更多额外的工作,这是“表单”类的“扩展”,因此使用方式为: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

与往常一样,扩展代码需要位于单独的模块中。

答案 5 :(得分:0)

试试这个:

Me.ShowDialog()

应该有帮助。

答案 6 :(得分:0)

如果你想要的东西是在winfom失去焦点或最小化后得到的。在我的情况下,当我在按钮上打开一个winform时工作。

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

答案 7 :(得分:0)

在表单加载时查看下面的示例

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

    Me.TopMost = True

End Sub

答案 8 :(得分:0)

以下似乎最容易提出一个名为&#34; Projects&#34;点击菜单选项后。如有必要,将加载表格,必要时将联合国最小化,并将其放在前面(&#39;焦点&#39;)。

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

答案 9 :(得分:0)

根据他的描述,采取吉姆诺兰所说的做法。这是最好的处理方式,以确保表单在所有其他表单的前面正确处理,以及处理表单,分配新表单的所有权以及显示表单

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

答案 10 :(得分:0)

我用这种方式解决了它(我对某人有用) - 这样即使在调试模式下它也会将隐藏的形式带到前面:

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

答案 11 :(得分:0)

有点关闭OP ...我有一个“菜单”,我从菜单打开。用户可以切换到其他窗口,然后再次“加载”仪表板。如果它已经装好,它将被带到前面。

声明frmFISDash = frmFISDashboard“global”

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

注意.WindowsState的设置 - 如果表单最小化.bringToFront不起作用。

答案 12 :(得分:0)

我知道这有点老了,但今天我遇到了类似的问题,这就是我解决它的方法。只要您不介意关闭开放表单并创建新表单,它就会起作用。

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

答案 13 :(得分:0)

从屏幕上绘制一个可见的最顶层表格,然后将此表单作为ShowDialog()调用的所有者。

答案 14 :(得分:0)

正如另一位用户发布的那样,我最喜欢的方法之一是设置表单所有者。通过这样做,当表单被聚焦,激活等时,子表单将始终位于父表单的顶部...这样做的好处是您不必捕获任何特殊事件并执行任何特殊代码。假设您有一个主窗体frmMain和一个弹出窗口frmPopup,您可以使用以下代码来确保弹出窗口始终位于主窗体之上而不使用topmost(可以使用但可能会产生一些不良影响)。

frmPopup.show(frmMain)

或者您可以使用较长的版本(由某人

发布)
frmPopup.Owner = frmMain
frmPopup.show()

另一件很棒的事情是你也可以将它与ShowDialog()

一起使用
frmPopup.ShowDialog(frmMain)

我知道这是一个古老的帖子,但也许人们仍然在寻找简单的解决方案。它确实帮助改进了我的程序的功能,使用的代码比以前少了很多。

答案 15 :(得分:0)

只需设置要显示在顶部的表单的Owner属性:

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

现在frmMessage始终位于frmMain之上,无论重点如何。

答案 16 :(得分:0)

我用:

dim tempResult as dialogResult = frmName.showDialog()

并以被叫形式:

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

调用表单代码在继续执行之前等待调用的表单结果。

答案 17 :(得分:0)

当无效时,请右键单击并选择“置于前面”。如果其他图像覆盖了必须位于前面的图像,只需右键单击每个图像,然后根据需要选择“发送到后面”。

答案 18 :(得分:0)

我的要求是弹出一个可能最小化的应用程序并使其最大化和活跃。在网上搜索了一下之后,我在c ++论坛中找到了部分答案。

WindowState = FormWindowState.Maximized
Me.Activate()

这使我的应用程序处于任何状态(maxxed,mini'd,大,小,后面的东西)。它将它带到了前面,并在屏幕上最大化。即把它弹出屏幕,这样我才能看到它!

答案 19 :(得分:-1)

一个小技巧:

me.hide()
me.visible = true