Здравствуйте, столкнулся с задачей, для которой не смог пока найти эффективного решения. Может быть, сообщество подскажет, в каком направлении копать? Задачка простая на первый взгляд, но эффективного решения пока не нашел.
Итак, ситуация - есть чужое ПО (А), работающее в SDI-режиме, т.е. каждый инстанс такого EXE работает со своим документом. И есть наше ПО (Б), отдельным EXE, которое автоматизирует некоторую работу в одном из открытых окон первого ПО. В системе может быть запущено несколько процессов типа А. Сейчас, что бы программа Б знала, в каком окне А работать, выводится окно диспетчера, в котором отображается список программ типа А, и пользователь самостоятельно выбирает, в каком окне типа А будет отрабатывать программа Б. Именно этот момент и нужно исключить: программа Б должна понимать, с каким именно окном А работал пользователь до того момента, как переключился в окно Б. Т.е. сценарий работы может быть таким (как пример):
Пользователь запустил программу А1.
Пользователь запустил программу А2.
Пользователь запустил браузер.
Пользователь запустил программу А3.
Пользователь переключился в программу А1.
Система запустила что-то по расписанию (обновления, например)
Пользователь запустил нашу программу Б, и нажал в её окне кнопку выполнения действий.
Сейчас выводится окно диспетчера, в котором пользователь должен выбрать в какой программе, А1, А2 или А3 нужно выполнять эти действия.
Задача поставлена таким образом, чтобы исключить п. 8 и программа Б сама могла выполнить действия в окне А1 без участия пользователя, т.к. последний инстанс типа А, с которым работал пользователь - это именно А1.
Сейчас решение мне видится в создании некоего третьего приложения В, которое будет висеть в памяти постоянно, с неким интервалом получать список процессов типа А, и каким-то образом производить сортировку этого списка, где элемент с индексом 0 будет соответствовать последнему использованному процессу типа А. Тогда приложение Б сможет обратится к скрытому диспетчеру В (назовем его так) и получить handle окна нужного инстанса типа А.
Но данное решение мне видится очень ненадежным и кривым, т.к. не очень очевидно, как именно выполнять сортировку списка (по возрастанию Handle процесса вообще не вариант ведь), а с высокой частотой опрашивать систему, какое сейчас окно активно, и если это окно типа А, то выносить его вверх списка тоже кажется неэффективным.
Эффективным решением оказалось бы, если приложение типа А при активации собственного окна само выставляло бы флаг собственной активизации (условно, писало бы свой Handle в файл), а приложение Б считывало бы это значение и таим образом знало бы, с каким окном ему работать. Беда в том, что заставить делать такое действие чужое приложение мне не видится возможным (да, я знаю, что, вероятно, можно было бы сделать инжект своей DLL к процессу типа А и уже там выполнить нужные действия, но этот путь тоже мне не видится очень уж простым).
Благодарю за потраченное время на прочтение и оказанное внимание, буду рад любым рекомендациям и советам.
Спасибо.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Планирую модель БД и столкнулся с тем что у меня много сязей между 3 таблицами со следуюшей зависимостью:
Есть блок, который я отключаю с помощью SetActiveЗатем проверяю, активен ли объект с помощью ActiveSelf