У меня есть устаревшее приложение, написанное на .Net. Нет доступных источников. Он использует скрипты vb для расширения внутренней логики посредством обработки событий. Так что это сочетание com и .net.
Я использовал приложение SpyUI и заметил, что интерфейс написан с помощью Windows Forms. Элементы управления названы в стиле .Net и похоже, что окна образуют единое целое (vc ++ и vb UI выглядят совершенно по-разному).
Я хочу расширить пользовательский интерфейс приложения, получив экземпляр System.Windows.Forms.Form для основной формы и изменив дерево элементов управления.
Итак, я пишу код в vb script, который создает мой com-объект, что-то вроде:
Set obj = CreateObject("MyUiExtender")
obj.InjectIntoUi()
Я пытаюсь получить основной дескриптор формы для объекта процесса, в который загружен, и этот код работает:
Process.GetCurrentProcess().MainWindowHandle; // a meaningfull value
Process.GetCurrentProcess().MainWindowTitle; // the title of the application
Пока все хорошо, но следующее не работает -> возвращает ноль
var mainForm = Control.FromHandle(Process.GetCurrentProcess().MainWindowHandle)
Мой объект был загружен в исполняемый файл, и я пытаюсь получить экземпляр формы для того же процесса. Я полагаю, это своего рода проблема с границами приложения. Мой код работает отлично, если мой com-объект загружается в приложение .net через
t = Type.GetTypeFromProgID("MyUiExtender")
dynamic c = Activator.CreateInstance(t)
c.InjectIntoUi();
Полагаю, использование сценариев vb как-то разрушает границы приложений ...
Возможно ли получить экземпляр основной формы приложения как экземпляр класса Windows.Forms.Form?