将焦点设置为新的弹出窗口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()结束子
只需在弹出加载事件上使用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()
方法触发的。它们在单独的线程中执行,其思想是在弹出窗体获取数据时显示加载程序窗体。一旦长操作(即提取)完成,加载程序窗体将关闭,并显示弹出窗体。
除了加载程序关闭后弹出窗口没有聚焦外,一切都按描述进行。
给定的两行代码正在解决我的问题,现在一切都按预期进行。