子フォームを閉じると、親フォームのフォーカスが失われます

ファコシニア

ボタンButton1押すと、_frm次のように新しいフォームが開きます。

Protected _frm As Form
[...]
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      _frm = New Form()
      AddHandler _frm.Deactivate, AddressOf OnFormDeactivated
      AddHandler _frm.FormClosed, AddressOf OnFormClosed
      With _frm
         .Location = PointToScreen(New Point(0, Height))
         .Text = "_frm"
         .Show(Me.FindForm)
      End With
End Sub

そして、のハンドラDeactivateFormClosed、次のようにイベントが定義されています。

Private Sub OnFormDeactivated(sender As Object, e As EventArgs)
      _frm.Close()
End Sub

Private Sub OnFormClosed(sender As Object, e As FormClosedEventArgs)
      Me.FindForm.RemoveOwnedForm(_frm)

      RemoveHandler _frm.Deactivate, AddressOf OnFormDeactivated
      RemoveHandler _frm.FormClosed, AddressOf OnFormClosed

      _frm.Dispose()
      _frm = Nothing

      WindowUtil.ShowWindow(Process.GetCurrentProcess) 'call to user32.dll ShowWindow
      WindowUtil.ToForeground(Process.GetCurrentProcess) 'call to user32.dll SetForegroundWindow
End Sub

子フォームを閉じると、親フォームにフォーカスが戻ります。別のアプリケーションを選択した場合も同じことが言えます。これは、目的の動作です。
ただし、親フォーム内の任意の場所をクリックすると、子フォームは正しく表示されなくなりますが、親フォーム(したがってアプリケーション全体)はフォーカスを失います。

編集
WindowUtil.vb方法:

<DllImport("user32.dll", EntryPoint:="SetForegroundWindow",
                 CallingConvention:=CallingConvention.StdCall,
                  CharSet:=CharSet.Unicode, SetLastError:=True)>
Private Shared Function SetForegroundWindow(ByVal handle As IntPtr) As Boolean
End Function

Public Shared Sub ToForeground(proc As Process)
         Dim ForegroundReturn As Boolean = SetForegroundWindow(proc.MainWindowHandle)
End Sub

<DllImport("user32.dll", EntryPoint:="ShowWindow",
                 CallingConvention:=CallingConvention.StdCall,
                 CharSet:=CharSet.Unicode, SetLastError:=True)>
Private Shared Function ShowWindow(ByVal handle As IntPtr, ByVal nCmd As Int32) As Boolean
End Function

Public Shared Sub ShowWindow(proc As Process)
         Dim ShowReturn As Boolean = ShowWindow(proc.MainWindowHandle, 1)
End Sub
ジミ

BringToFront()/Activate()メソッドの呼び出しとForm.Close()所有されているフォームを閉じる呼び出しの間に遅延を追加することをお勧めします。所有者フォームをクリックしたときと別のアプリケーションに属するウィンドウをクリックしたときの両方の状況でより安定した結果が得られるはずです。

注として:

そのため、PInvokingは必要ありません(つまり、フレームワークはすでにこれを行っています)。

Form.Close()所有者フォームのアクティブ化後に呼び出されます。これにより、ActiveControlこのプロパティを明示的に設定せずに、マウスアクションを受け取るコントロール(所有者フォーム内)がになります。

フォーム15性質(フォームの作成方法と含まれるコントロールの数)が閉じる必要のある時間に影響を与える可能があるため、ミリ秒の遅延は微調整できます(OwnerForm.Activate()asyncActivateForm()メソッドから戻る直前に呼び出されてフォームがオンになるため)トップは直後に閉じられます)。これにより、よりスムーズな遷移生成されますが、別のプロセスに属するウィンドウをクリックしたときに所有者フォームが点滅する場合もあります。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
   ' someForm is clearly a made-up class name :) Set it to actual the class name.
    Dim frm As New someForm()
    AddHandler frm.Deactivate, AddressOf OnFormDeactivated
    With frm
        ' Whatever this means to you
        .Location = PointToScreen(New Point(0, Height))
        .Text = "frm"
        .Show(Me)
    End With
End Sub

Private Async Sub OnFormDeactivated(sender As Object, e As EventArgs)
    Dim frm = DirectCast(sender, Form)
    RemoveHandler frm.Deactivate, AddressOf OnFormDeactivated
    Await ActivateForm(Me)
    frm.Close()
End Sub

Private Async Function ActivateForm(frm As Form) As Task
    Await Task.Delay(15)
    frm.BringToFront()
    Await Task.Delay(15)
    frm.Activate()
End Function

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

キーボードを閉じるとTextInputのフォーカスが失われます

分類Dev

フォントダイアログを閉じるとウィンドウのフォーカスが失われます

分類Dev

子スレッドから親フォームを閉じる

分類Dev

QtableViewセルがフォームを閉じることにフォーカスを失ったときに編集中のデータを保存する方法

分類Dev

フォーカスを失った後のすべてのフレーム(子と親)を表示する

分類Dev

文字を入力するたびに入力フォームのフォーカスが失われる

分類Dev

メインフォームを閉じるときに複数の親フォームを閉じる

分類Dev

別のフォームが閉じられたときにフォームを表示する

分類Dev

フォームを閉じるとエラーが返されます

分類Dev

別のフォームが閉じたらフォームを閉じる

分類Dev

フォームを閉じるとメモリが解放されます

分類Dev

sub()を使用すると、データフレームのフォーマットが失われます

分類Dev

フォームを閉じたときに開いているフォームがない場合は、特定のフォームを開きます

分類Dev

DrawerLayoutを閉じるとRecyclerViewがフォーカスされる

分類Dev

親フォームが閉じないようにする

分類Dev

カスタムウィジェットを使用すると、Djangoフォームフィールドデータが失われます

分類Dev

window.print()を使用するとフォーカスが失われます

分類Dev

モーダルフォームから非モーダルフォームを表示すると、モーダルフォームが閉じます

分類Dev

フォームが送信されると、フォームの動的フロートがNaNに変わります

分類Dev

HTML画像をアップロードすると、他のフォームデータが失われます

分類Dev

両方を閉じずに親を閉じる前に子フォームをロードする方法

分類Dev

フォームを閉じるときにタスクが完了するのを待っています

分類Dev

Django:フォームテンプレートの<select>オプションを変更するとフォーム属性が失われます

分類Dev

ドキュメントを閉じるとフォーマットが失われます

分類Dev

WinFormsでモーダル子フォームを閉じた後、親フォームで発生するイベントはどれですか?

分類Dev

フォームデータが小道具としてフォームに渡されると、入力のあるカスタムウィジェットはreact-jsonschema-formでフォーカスを失います

分類Dev

redux-formを使用すると、最初の文字を入力するとフォーカスが失われます

分類Dev

親フォームの変数を子フォームで使用しますか?

分類Dev

VB.NETユーザーが閉じるまでフォームを離れることを禁止する

Related 関連記事

  1. 1

    キーボードを閉じるとTextInputのフォーカスが失われます

  2. 2

    フォントダイアログを閉じるとウィンドウのフォーカスが失われます

  3. 3

    子スレッドから親フォームを閉じる

  4. 4

    QtableViewセルがフォームを閉じることにフォーカスを失ったときに編集中のデータを保存する方法

  5. 5

    フォーカスを失った後のすべてのフレーム(子と親)を表示する

  6. 6

    文字を入力するたびに入力フォームのフォーカスが失われる

  7. 7

    メインフォームを閉じるときに複数の親フォームを閉じる

  8. 8

    別のフォームが閉じられたときにフォームを表示する

  9. 9

    フォームを閉じるとエラーが返されます

  10. 10

    別のフォームが閉じたらフォームを閉じる

  11. 11

    フォームを閉じるとメモリが解放されます

  12. 12

    sub()を使用すると、データフレームのフォーマットが失われます

  13. 13

    フォームを閉じたときに開いているフォームがない場合は、特定のフォームを開きます

  14. 14

    DrawerLayoutを閉じるとRecyclerViewがフォーカスされる

  15. 15

    親フォームが閉じないようにする

  16. 16

    カスタムウィジェットを使用すると、Djangoフォームフィールドデータが失われます

  17. 17

    window.print()を使用するとフォーカスが失われます

  18. 18

    モーダルフォームから非モーダルフォームを表示すると、モーダルフォームが閉じます

  19. 19

    フォームが送信されると、フォームの動的フロートがNaNに変わります

  20. 20

    HTML画像をアップロードすると、他のフォームデータが失われます

  21. 21

    両方を閉じずに親を閉じる前に子フォームをロードする方法

  22. 22

    フォームを閉じるときにタスクが完了するのを待っています

  23. 23

    Django:フォームテンプレートの<select>オプションを変更するとフォーム属性が失われます

  24. 24

    ドキュメントを閉じるとフォーマットが失われます

  25. 25

    WinFormsでモーダル子フォームを閉じた後、親フォームで発生するイベントはどれですか?

  26. 26

    フォームデータが小道具としてフォームに渡されると、入力のあるカスタムウィジェットはreact-jsonschema-formでフォーカスを失います

  27. 27

    redux-formを使用すると、最初の文字を入力するとフォーカスが失われます

  28. 28

    親フォームの変数を子フォームで使用しますか?

  29. 29

    VB.NETユーザーが閉じるまでフォームを離れることを禁止する

ホットタグ

アーカイブ