如何找到活动的子窗口?

时间:2010-08-05 10:14:28

标签: .net winforms

如何找到活动的子窗口(如在模式对话框中的焦点编辑)。我知道如何枚举子窗口,但我不知道如何检测子窗口是否处于活动状态(焦点)。

4 个答案:

答案 0 :(得分:1)

基本上它只是一个简单的Linq查询:

      var active = (from form in Application.OpenForms.OfType<Form>()
                    where form.Focused
                    select form).FirstOrDefault();

活动可以为null或表单。只是一个很少形式的简短例子:

class Program
{
  static void Main(string[] args)
  {
    for (int i = 0; i < 10; i++)
    {
      Form sample = new Form();
      sample.Text = i.ToString();
      sample.Show();
    }

    while (true)
    {
      var active = (from form in Application.OpenForms.OfType<Form>()
                    where form.Focused
                    select form).FirstOrDefault();

      if (active != null)
        Console.Write(active.Text);

      Application.DoEvents();
      Thread.Sleep(100);
    }

  }
}

答案 1 :(得分:0)

如果您正在寻找不同进程的活动子窗口,那么您可以将IntPtr与子窗口匹配到IntPtr

  [DllImport("User32")]
  public static extern IntPtr GetForegroundWindow();

如果这不是您想要的,请您详细说明一下您的问题。

答案 2 :(得分:0)

如果您正在谈论Mdi子窗口,您可以使用ActiveMdiChild,它是表单类的属性(在您的mdiparent上使用它)。

如果您正在谈论集中控制,您可以使用ActiveControl,这是每个容器控件的属性(例如您的所有表单)

答案 3 :(得分:0)

我在谷歌尝试超过2小时后得到了答案。这就是我所拥有的:

StringBuilder builder = new StringBuilder(500);
int foregroundWindowHandle = GetForegroundWindow();
uint remoteThreadId = GetWindowThreadProcessId(foregroundWindowHandle, 0);
uint currentThreadId = GetCurrentThreadId();      
//AttachTrheadInput is needed so we can get the handle of a focused window in another app
AttachThreadInput(remoteThreadId, currentThreadId, true);
//Get the handle of a focused window
int focused = GetFocus();
//Now detach since we got the focused handle
AttachThreadInput(remoteThreadId, currentThreadId, false);

由于我们有焦点窗口的句柄,我们可以得到它的名称/类以及其他必要的信息

在这种情况下,我只是找出班级名称:

StringBuilder winClassName = new StringBuilder();
int numChars = CustomViewAPI.Win32.GetClassName((IntPtr)focused, winClassName, 
winClassName.Capacity);