0

*編集:OK、これは私の本当の問題です。以下のシナリオは、フォームがMDIChildの場合にのみ発生します..コードを提供してくれる人に感謝します

ラベル、パネル、ボタンなどを含むフォームがあります。問題があるのは、form2 がアクティブなウィンドウ/フォームであり、form1 内のコントロールをクリックすると、form1 自体がアクティブになりません。私がしたいのは、クリックしたフォームではなく、その中のコントロール (任意のコントロール) だけである場合でも、form1 がアクティブになることです。

フォーム上のコントロールをクリックすると、フォーム上でイベントが発生すると考えています。その特定のイベントだけを知ることができれば、それは助けになるでしょう-多分(存在する場合、そのイベントに Me.activate を追加するだけです)。コントロール(ラベルなど)がクリックされたときに一連のイベントを検索しようとしましたが、役に立ちませんでした。誰かがこれで私を助けてくれることを願っています。

前もって感謝します。

*編集

私は私の質問をより理解しやすいものにしようとします..

コントロールのみがクリックされたときにフォームをアクティブにするにはどうすればよいですか (たとえば、ラベルまたはテキストボックス)? フォーム自体以外のフォーム内をクリックしても、フォームがアクティブ化またはフォーカスされません。

私は1つのコントロールでこれを行うことができます..

Private Sub Label1_Click - Handles Label1.Click
   Me.Activate()
End Sub

しかし、20 個のコントロール (ラベル、ボタン、テキスト ボックス、コンボ ボックスなど) がある場合はどうなるでしょうか。見る?=)

4

2 に答える 2

0

MDI以外のフォームでは、フォーム内のコントロールをクリックすると、フォームが自動的にアクティブになります。

于 2013-03-07T05:22:49.280 に答える
0

編集: この回答は MDI アプリケーションには適用されません。

あなたが本当に知りたいのは、どのフォームが現在フォアグラウンド ウィンドウであるか (存在する場合) だと思います。最初に理解する必要があるのは、フォーム インスタンスはウィンドウ内に存在するが、ウィンドウの動作は上位のどこかで制御されるということです。インスタンスを指す変数によってフォーム インスタンスが識別されるのと同様に、ウィンドウはウィンドウ ハンドルと呼ばれるものによって識別されます。

これを知った上で、フォームが「アクティブな」フォームであるかどうかを確認する適切な方法は次のとおりです。

  1. Form1とのインスタンスを含むウィンドウのウィンドウ ハンドルを見つけます。Form2
  2. フォアグラウンド ウィンドウ (任意のウィンドウ) のウィンドウ ハンドルを見つける
  3. ステップ 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、私の拡張メソッドの代わりに使用でき、問題なく動作します。

于 2013-01-04T19:12:14.907 に答える