将焦点设置为新的弹出窗口winform

本文关键字:窗口 winform 焦点 设置 | 更新日期: 2023-09-27 18:21:44

我有一个在系统托盘中运行的应用程序,当用户按下一系列按钮时,它会显示一个需要填写的WinForm并发送电子邮件。除了显示WinForm时的部分外,一切都很好。它显示在顶部,焦点似乎在文本框上,但窗口未处于活动状态。

用于调用弹出窗体的代码。

My.Forms.frmpopup.ShowDialog()

弹出式上的代码

Private Sub frmPopup_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    Activate()
    BringToFront()
End Sub
Private Sub frmPopup_Load(sender As Object, e As EventArgs) Handles Me.Load
    TextBoxName.Focus()
End Sub

真正令人兴奋的是,只要用户当前不专注于Internet Explorer窗口,这就可以工作。如果我找到解决方案,我会把它发布出来。


似乎将两个Subs合并为一个子解决了问题,我将继续测试。

Private Sub-frmPopup_Shown(发送方为对象,e为EventArgs)句柄我。显示Activate()BringToFront()TextBoxName.Focus()结束子

将焦点设置为新的弹出窗口winform

只需在弹出加载事件上使用Active();

确保您的应用程序也有焦点。。。

包括以下导入。。。

<Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True, CharSet:=Runtime.InteropServices.CharSet.Auto)> _
Private Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As Long
End Function

在调用弹出窗口之前,或者从弹出窗口LOAD事件中调用

SetForegroundWindow(Me.Handle)

SendToTop(true)应将窗口带到TopMost。

Private Const SWP_NOSIZE As Integer = &H1
Private Const SWP_NOMOVE As Integer = &H2
Private Shared ReadOnly HWND_TOPMOST As New IntPtr(-1)
Private Shared ReadOnly HWND_NOTOPMOST As New IntPtr(-2)
Public Declare Function SetWindowPos Lib "user32" (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
Public Sub SendToTop(toTop As Boolean)
    If toTop Then
        SetWindowPos(Me.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
    Else
        SetWindowPos(Me.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
    End If
End Sub

在我的用例*中,以下显示了所需的结果:

popup.Show();
popup.Activate();

其中CCD_ 3。不确定为什么必须在Show()方法之后调用Activate(),但事实证明这是正确的。


用例

我的用例是显示popup和loader表单。popup和loader都是顶级表单,都是用ShowDialog()方法触发的。它们在单独的线程中执行,其思想是在弹出窗体获取数据时显示加载程序窗体。一旦长操作(即提取)完成,加载程序窗体将关闭,并显示弹出窗体。

除了加载程序关闭后弹出窗口没有聚焦外,一切都按描述进行。

给定的两行代码正在解决我的问题,现在一切都按预期进行。