Представленная здесь статья позволяет программистам 1С выйти на системный уровень, используя технологию P/Invoke из .Net framework. Для подключения .Net framework незаменимую помощь окажет внешний компонент Elisy .Net Bridge.
Elisy .Net Bridge - это набор компонентов и методик для бесшовного подключения .Net framework к 1С с целью использования всей функциональности .Net.
Самое полезное отличие .Net Bridge - это собственный механизм преобразования типов, дающий явные преимущества по сравнению с написанием ВК на C# и открывающий неизвестные ранее возможности. К таким возможностям как раз и относится технология P/Invoke. Возможность эта такая обширная, что дало возможность иностранцам открыть сайт pinvoke.net и разместить на нем информацию о более 8000 определениях системных методов, структур и перечислений.
Представленная здесь обработка с примером задействует 2 системных функции Windows: SendMessage и FindWindowEx. Обе они определены в библиотеке User32.dll. Затем первая из них используется для изменения заголовка окна 1С, а вторая – для поиска нужного окна внутри главного окна 1С. В результате работы внешней обработки появится примерно следующее:

Работа программы начинается стандартно с подключения внешнего компонента:
//Подключить внешний компонент Elisy .Net Bridge
AttachAddIn("AddIn.ElisyNetBridge");
AddIn = New("AddIn.ElisyNetBridge");
net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");
Переменной исходныйКод присваивается текст конструкций C#, описывающих функции Dll, а также методы доступа к ним из класса Пример.Обработчик. Код компилируется вызовом процедуры СкомпилироватьИсходныйКод. Подробнее о компиляции кода можно узнать из статьи: "Определение классов .Net". Стоит отметить, что описание функций библиотек DLL в C# осуществляется атрибутом [DllImport("user32.dll")] с указанием имени библиотеки. В данном случае User32.dll.
Вызовом метода GetCurrentProcess.MainWindowHandle класса Process получаем ссылку на главное окно 1С. А вызовом определенного нами метода SendMessage устанавливаем главному окну новый заголовок. За команду отвечает сообщение WM_SETTEXT. Большую часть архитектуры Windows занимает система сообщений. Поэтому отправка сообщения через SendMessage может пригодиться в других сценариях эмуляции движения курсора, нажатия клавиш, требованиях перерисовки окна и т.д.
Другое действие, которое нам удается сделать при помощи технологии P/Invoke является поиск в главном окне 1С дочернего окна – рабочую область, на которой "живут" пользовательские формы 1С. С этой операцией справляется FindWindow метод, общащающийся к функции FindWindowEx библиотеки User32.dll. Эта же операция может пригодиться, если мы захотим отобразить немодальную форму в окне 1С средствами не 1С, а, например, Xaml или WinForms.
Обрисовка рисунка происходит стандартными средствами .Net framework с использованием пространства имен System.Drawing. Нужно сказать, что рисунок в примере получается нестабильным, так как затирается другими формами. Чтобы он постоянно держался, нужно обратиться к другим неописанным здесь механизмам.
Представленная технология дает дополнительные инструменты в арсенал 1С-овцев, позволяя писать практически теже программы, что и на остальных популярных языках программирования под Windows. P/Invoke не ограничен использованием только системных библиотек. Он работает с любыми другими DLL. Например, можно найти примеры в Интернет обращения к DirectX.
PInvoke.epf (7,44 kb)