1

システムトレイで実行されるアプリがあり、ユーザーがボタンの戦闘を押すと、入力する 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 ウィンドウに集中していない限り、これが機能することです。解決策が見つかったら、投稿します。


2 つのサブを 1 つのサブにマージすると問題が解決するようです。テストを続けます。

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

4

4 に答える 4

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 に答える