C# хронология активных окон Windows

328
16 мая 2017, 01:27

Здравствуйте, столкнулся с задачей, для которой не смог пока найти эффективного решения. Может быть, сообщество подскажет, в каком направлении копать? Задачка простая на первый взгляд, но эффективного решения пока не нашел.

Итак, ситуация - есть чужое ПО (А), работающее в SDI-режиме, т.е. каждый инстанс такого EXE работает со своим документом. И есть наше ПО (Б), отдельным EXE, которое автоматизирует некоторую работу в одном из открытых окон первого ПО. В системе может быть запущено несколько процессов типа А. Сейчас, что бы программа Б знала, в каком окне А работать, выводится окно диспетчера, в котором отображается список программ типа А, и пользователь самостоятельно выбирает, в каком окне типа А будет отрабатывать программа Б. Именно этот момент и нужно исключить: программа Б должна понимать, с каким именно окном А работал пользователь до того момента, как переключился в окно Б. Т.е. сценарий работы может быть таким (как пример):

  1. Пользователь запустил программу А1.

  2. Пользователь запустил программу А2.

  3. Пользователь запустил браузер.

  4. Пользователь запустил программу А3.

  5. Пользователь переключился в программу А1.

  6. Система запустила что-то по расписанию (обновления, например)

  7. Пользователь запустил нашу программу Б, и нажал в её окне кнопку выполнения действий.

  8. Сейчас выводится окно диспетчера, в котором пользователь должен выбрать в какой программе, А1, А2 или А3 нужно выполнять эти действия.

Задача поставлена таким образом, чтобы исключить п. 8 и программа Б сама могла выполнить действия в окне А1 без участия пользователя, т.к. последний инстанс типа А, с которым работал пользователь - это именно А1.

Сейчас решение мне видится в создании некоего третьего приложения В, которое будет висеть в памяти постоянно, с неким интервалом получать список процессов типа А, и каким-то образом производить сортировку этого списка, где элемент с индексом 0 будет соответствовать последнему использованному процессу типа А. Тогда приложение Б сможет обратится к скрытому диспетчеру В (назовем его так) и получить handle окна нужного инстанса типа А.

Но данное решение мне видится очень ненадежным и кривым, т.к. не очень очевидно, как именно выполнять сортировку списка (по возрастанию Handle процесса вообще не вариант ведь), а с высокой частотой опрашивать систему, какое сейчас окно активно, и если это окно типа А, то выносить его вверх списка тоже кажется неэффективным.

Эффективным решением оказалось бы, если приложение типа А при активации собственного окна само выставляло бы флаг собственной активизации (условно, писало бы свой Handle в файл), а приложение Б считывало бы это значение и таим образом знало бы, с каким окном ему работать. Беда в том, что заставить делать такое действие чужое приложение мне не видится возможным (да, я знаю, что, вероятно, можно было бы сделать инжект своей DLL к процессу типа А и уже там выполнить нужные действия, но этот путь тоже мне не видится очень уж простым).

Благодарю за потраченное время на прочтение и оказанное внимание, буду рад любым рекомендациям и советам.

Спасибо.

READ ALSO
Рестарт программы

Рестарт программы

Есть первая форма Input

315
EntytyFrameworkCore. Подскажите по модели БД

EntytyFrameworkCore. Подскажите по модели БД

Планирую модель БД и столкнулся с тем что у меня много сязей между 3 таблицами со следуюшей зависимостью:

359
Как вернуть блок на прежнее место спустя время?

Как вернуть блок на прежнее место спустя время?

Есть блок, который я отключаю с помощью SetActiveЗатем проверяю, активен ли объект с помощью ActiveSelf

302