Как я могу найти активное дочернее окно? - PullRequest
1 голос
/ 05 августа 2010

Как мне найти активное дочернее окно (например, редактировать фокус в диалоговом окне). Я знаю, как перечислять дочерние окна, но не знаю, как определить, активно ли дочернее окно (фокус).

Ответы [ 4 ]

1 голос
/ 05 августа 2010

По сути, это простой запрос Linq:

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

Где активным может быть ноль или форма.Просто короткий пример с несколькими формами:

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);
    }

  }
}
0 голосов
/ 05 августа 2010

Если вы говорите о дочерних окнах Mdi, вы можете использовать ActiveMdiChild, который является свойством класса формы (используйте его в mdiparent).

Если вы говорите о сфокусированных элементах управления, вы можете получитьиспользуя ActiveControl, который является свойством каждого элемента управления контейнера (например, всех ваших форм)

0 голосов
/ 05 августа 2010

Я получил ответ после попытки более 2 часов с Google. Вот что у меня есть:

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);
0 голосов
/ 05 августа 2010

Если вы ищете активное дочернее окно другого процесса, то вы можете сопоставить IntPtr с дочерним окном и IntPtr с

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

Если это не то, что вы ищете, не могли бы вы подробнее рассказать о вашей проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...