編集: この回答は MDI アプリケーションには適用されません。
あなたが本当に知りたいのは、どのフォームが現在フォアグラウンド ウィンドウであるか (存在する場合) だと思います。最初に理解する必要があるのは、フォーム インスタンスはウィンドウ内に存在するが、ウィンドウの動作は上位のどこかで制御されるということです。インスタンスを指す変数によってフォーム インスタンスが識別されるのと同様に、ウィンドウはウィンドウ ハンドルと呼ばれるものによって識別されます。
これを知った上で、フォームが「アクティブな」フォームであるかどうかを確認する適切な方法は次のとおりです。
Form1とのインスタンスを含むウィンドウのウィンドウ ハンドルを見つけます。Form2
- フォアグラウンド ウィンドウ (任意のウィンドウ) のウィンドウ ハンドルを見つける
- ステップ 2 で見つかった値を、ステップ 1 で見つかったすべての値と比較します。
フォアグラウンド ウィンドウが変更された場合にイベントを発生させたいと思うかもしれませんが、実際の実装はあなたに任せます。ステップ 1 と 2 を実行するにはいくつかの方法があると思いますが、頭の中で解決策を提示することはできません。うまくいけば、私はあなたを正しい軌道に戻しました.
編集
または、フォームのContainsfocusプロパティを使用できます。その値が True の場合、フォームがフォアグラウンド ウィンドウであると安全に想定できます。このプロパティについては、独自の実装を作成するまで知りませんでした。とにかくお見せします。
Windows API 呼び出しのみを含む 1 つのモジュール
Friend Module NativeMethods
Friend Declare Function GetForegroundWindow Lib "user32.dll" () As IntPtr
End Module
このメソッドを呼び出すと、フォアグラウンド ウィンドウ (存在する場合) のウィンドウ ハンドルが返されます。
Formクラスの拡張メソッドを含む 1 つのモジュール
Imports System.Runtime.CompilerServices
Public Module FormExtensions
<Extension>
Public Function IsForeground(f As Form) As Boolean
Return (f.Handle = NativeMethods.GetForegroundWindow)
End Function
End Module
このメソッドを呼び出すと、指定されたフォームfがフォアグラウンド ウィンドウと同じウィンドウ ハンドルを持っているかどうかが返されます。
使用例
Timerフォームがフォアグラウンド ウィンドウであるかどうかを定期的にチェックする を使用できます。
Public Class Form1
Private WithEvents timer As New Timer With {.Enabled = True}
Private Sub timer_Tick(sender As Object, e As EventArgs) Handles timer.Tick
If Me.IsForeground() Then
Console.WriteLine("this instance of Form1 is the foreground window")
End If
End Sub
End Class
前に言ったようにMe.ContainsFocus、私の拡張メソッドの代わりに使用でき、問題なく動作します。