0

*编辑:好的,所以这是我真正的问题,只有当表单是 MDIChild 时才会发生以下情况。感谢任何可以为我提供代码的人

我有一个带有标签、面板、按钮等的表单。我遇到的问题是,form2 是我的活动窗口/表单,我单击了 form1 内的控件,但 form1 不会自行激活。我想要发生的事情是让form1激活,即使它不是我点击的表单,只有它里面的控件(任何控件)..

我在想,如果我单击表单上的控件,则会在表单上触发一个事件。如果我只能知道某个事件,那会有所帮助 - 也许(因为如果它存在,我可以在该事件上添加 Me.activate)。当单击控件(例如标签)时,我尝试搜索一系列事件,但无济于事。我希望有人可以帮助我解决这个问题。

提前致谢。

*编辑

我会尽量让我的问题更容易理解..

仅单击控件(例如,标签或文本框)时,如何激活表单?当我在其中单击时,我的表单没有激活或聚焦,除了表单本身..

我可以在一个控件上做到这一点..

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

但是如果我有 20 个控件(标签、按钮、文本框、组合框等)怎么办?看?=)

4

2 回答 2

0

编辑:这个答案不适用于 MDI 应用程序。

我认为您真正想知道的是您的哪一个表单当前是前景窗口(如果有)。您需要了解的第一件事是表单实例存在于窗口中,但窗口的行为是在更高的地方控制的。类似于如何通过指向实例的变量来识别表单实例,可以通过所谓的窗口句柄来识别窗口。

知道了这一点,找出表单是否是“活动”表单的正确方法是:

  1. 找出包含我们的实例的窗口的窗口Form1句柄Form2
  2. 找出前台窗口的窗口句柄(可以是任何窗口)
  3. 将步骤 2 中找到的值与步骤 1 中找到的所有值进行比较

如果前台窗口发生变化,您可能希望触发一个事件,但我将把实际实现留给您。可能有几种方法可以执行第 1 步和第 2 步,但我想不出任何解决方案。希望我让你回到正确的轨道上。

编辑

或者,您可以使用表单的Containsfocus属性。如果它的值为 True,您可以放心地假定您的窗体是前景窗口。直到我编写了自己的实现之后才发现这个属性,无论如何我都会向你展示:

一个仅包含 Windows API 调用的模块

Friend Module NativeMethods

    Friend Declare Function GetForegroundWindow Lib "user32.dll" () As IntPtr

End Module

调用此方法将返回前景窗口的窗口句柄(如果有)。

Form一个包含类扩展方法的模块

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定期检查表单是否为前台窗口的 a。

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 回答
0

非 MDI表单中,当您单击其中的任何控件时,表单会自动激活。

于 2013-03-07T05:22:49.280 回答