繁体   English   中英

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

[英]Set focus to new popup winform

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

用于调用 Popup 窗体的代码。

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 窗口,它就可以工作。 如果我找到解决方案,我会发布它。


似乎将两个 Sub 合并为一个 Sub 可以解决问题,我将继续测试。

Private Sub frmPopup_Shown(sender As Object, e As EventArgs) 处理 Me.Shown Activate() BringToFront() TextBoxName.Focus() End Sub

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

包括以下导入...

<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

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

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

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

其中popup: Form 不知道为什么必须在Show()方法之后调用Activate() ,但事实证明它可以正常工作。


用例

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM