Найти окно по заголовку, что такое заголовок окна?

Мне нужно отслеживать время работы программы. Эта программа открывает следующее окно: введите здесь описание изображения

В то же время я запускаю свою программу, которая по таймеру делает:

private void TimerCheckGroups_Tick(object sender, EventArgs e)
{
  IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, "Execution");
  if (windowPtr != IntPtr.Zero)
    Console.Beep();<--------
}

Но линия звукового сигнала никогда не попадает. Я неправильно понял значение заголовка окна?

--ADD-- Я постараюсь сделать фазы выполнения более понятными.

Запуск ----> запустить мой регистратор.

Пользователь-------> запускает программу A, которая запускает программу B (не видна), которая запускает окно C. C имеет заголовок Execution.

Когда я запускаю решение, предложенное dontbyteme, появляется только программа B, поэтому появляется только 1 окно.

Короче

  • регистратор: не виден, так как это программа в трее

  • программа A: видна, так как это основная программа

  • программа B: не видна, так как для нее установлено значение Notvisible

  • программа C: не видно почему?!?!?!?


--РЕШЕНИЕ СПАСИБО ДЖАРРЕТУ--

  • логгер бездействует с таймером, контролирующим процессы

  • программа А запускается, но никому до нее нет дела. Затем программа А запускает программу Б

  • когда программа B бодрствует, я нахожу окно и начинаю запись


person Patrick    schedule 22.12.2015    source источник
comment
Можете ли вы заставить свою программу запускать программу Execution? Если вам придется запускать обе программы вручную, ваше время будет неверным. Кроме того, если ваша программа отслеживания запускает программу выполнения, вы точно знаете, когда она запустилась.   -  person Jarrett Robertson    schedule 22.12.2015
comment
Нет, я не могу. Программа с оконным исполнением запускается пользователем. В то время как моя программа является логгером, поэтому она запускается при запуске окна.   -  person Patrick    schedule 22.12.2015
comment
В зависимости от того, насколько вам удобно упорядочивать, вы заглядывали в `EnumWindows, я использовал его, чтобы найти открытые окна. Он находится в user32.dll. Это даст вам окна, которые открыты, но не будут обращаться, зная, что была запущена новая программа.   -  person Jarrett Robertson    schedule 22.12.2015
comment
Кроме того, этот пост может быть вам полезен. stackoverflow.com/questions/649900/   -  person Jarrett Robertson    schedule 22.12.2015
comment
@JarrettRobertson, спасибо, это для WPF?   -  person Patrick    schedule 22.12.2015
comment
Нет, но я полагаю, вы могли бы достаточно легко заставить его работать с WPF. Я признаю, что мои познания в WPF ограничены, но я знаю, что вы можете писать в нем код на С#.   -  person Jarrett Robertson    schedule 22.12.2015
comment
@JarrettRobertson Ничего специфичного для WPF ни в коде взаимодействия, который вы разместили в своем ответе, ни в связанном вопросе/ответе SO. Оригинальный постер должен быть готов.   -  person Steven Rands    schedule 22.12.2015


Ответы (2)


Следующий вопрос касается того, как узнать, когда запускаются программы. Обнаружение запуска приложения Кроме того, вы можете перечислить окна на своем компьютере с помощью импорт dll и использование EnumWindows. Примеры pInvokes, которые помогут вам, перечислены.

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern int GetWindowTextLength(IntPtr hWnd);
    [DllImport("user32.dll")]
    private static extern bool IsWindowVisible(IntPtr hWnd);
person Jarrett Robertson    schedule 22.12.2015
comment
Таким образом, проблема была связана со временем, пожалуйста, посмотрите мое редактирование, так как я последовал вашему совету, чтобы найти решение. Я бы хотел, чтобы вы опубликовали решение, в котором говорится, что проблема связана с одновременным запуском обеих программ. Я думаю, ты это заслужил. - person Patrick; 22.12.2015

Вы можете попробовать получить окно, пробежав каждое окно и сравнив его с заголовком:

    foreach(Window window in Application.Current.Windows)
    {
        if(window.Title == "Execution")
        {
            Console.Beep();
            // ...
        }
    }

Свойство Title — это то, что вы назвали Caption.

person dontbyteme    schedule 22.12.2015