1

我有一个在系统托盘中运行的应用程序,当用户按下按钮的战斗时,它会显示要填写的 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) Handles Me.Shown Activate() BringToFront() TextBoxName.Focus() End Sub

4

4 回答 4

2

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

于 2013-07-09T20:09:58.130 回答
1

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
于 2013-07-09T15:58:32.240 回答
1

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

包括以下导入...

<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)
于 2013-07-09T15:43:16.963 回答
0

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

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

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


用例

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

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

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

于 2021-11-03T08:10:53.270 回答