Изменение размера всплывающего окна с помощью команд .NET System.Windows.Forms в Wonderware Application Server

Я пытаюсь изменить размер открытого окна, и, поскольку в Wonderware Application Server, кажется, нет способа сделать это, я подумал, что, возможно, функция .Net может работать. Я использовал приведенный ниже сценарий System.Windows.Forms.MessageBox.Show в сервере приложений Wonderware со сценарием активации кнопки. Есть ли аналогичная функция для простого изменения высоты и ширины текущего активного окна?

Окно сообщения является лишь примером того, что приложение Wonderware Application Server может получить доступ к некоторым функциям System.Windows.Forms в своих сценариях QuickScript.NET. Библиотека Windows Forms (system.windows.forms.dll) была импортирована в приложение Wonderware Application Server. Сценарий будет работать в открытом окне, и я хотел бы изменить его размер, но я не могу заставить функцию размера .Net работать в QuickScript.NET.


Нашел этот пример DLL системной платформы http://www.plctalk.net/qanda/showthread.php?t=114301, но Visual Studio имеет около 20 различных шаблонов библиотеки классов. Если я попробую библиотеку классов (.Net Framework) - шаблон С#, я получу dll и смогу импортировать ее в системную платформу, затем я смогу найти функцию в браузере функций, но во время выполнения ничего не происходит, когда скрипт запускается, и я получаю это ошибка в журнале SMC: исключение выполнения скрипта. Сообщение: нестатический метод требует цели..

Демонстрация — Visual Studio 2019 и библиотека классов (.Net Framework) — код шаблона C#:

namespace ClassLibraryDemo
{
    public class DemoClass
    {
        public int GetAdd(int a, int b)
        {
            return a + b;
        }
    }
}

Демонстрация — сценарий кнопки системной платформы — для этого демонстрационного кода теперь он работает с добавленной строкой cls = new.

dim cls as ClassLibraryDemo.DemoClass;
cls = new ClassLibraryDemo.DemoClass();
Me.°Test = cls.GetAdd(Me.°Test,3);

К сожалению, код изменения размера, который мне нужен, по-прежнему имеет нестатическую ошибку, и в нем уже есть объект, равный новой строке.

ResizableForm — Visual Studio 2019 и библиотека классов (.Net Framework) — код шаблона C#:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ClassLibraryROB4
{
    public class ResizableForm
    {
        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();

        public Form GetCurrentWindow()
        {
            IntPtr activeWindowHandle = GetForegroundWindow();
            Form f = Control.FromHandle(activeWindowHandle) as Form;
            return f;
        }
    }
}

ResizableForm — скрипт кнопки системной платформы. Теперь с Try-Catch

Try

Dim myLib As ClassLibraryROB4.ResizableForm;
Dim myGfc As System.Windows.Forms.Form;

myLib = new ClassLibraryROB4.ResizableForm();
myGfc = myLib.GetCurrentWindow();

myGfc.Width = 10;
myGfc.Height = 10;

catch LogError(error); endtry;

Ошибка SMC — попробуйте поймать


A900.Faceplate1_Control.BUTTON2: System.Reflection.TargetException: Non-static method requires a target.
   at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
   at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at ArchestrA.QuickScript.EvaluateFunction.Evaluate(IReferenceManagerRuntime rmr)
   at ArchestrA.QuickScript.RunExpressionStatement.Run(RuntimeContext context)
   at ArchestrA.QuickScript.RunStatements.Run(RuntimeContext context)
   at ArchestrA.QuickScript.RunTryCatch.Run(RuntimeContext context)

person Tanquen    schedule 20.04.2021    source источник


Ответы (2)


создайте пользовательскую форму и установите свойства по своему усмотрению:

static CustomMsgBox MsgBox; static DialogResult result = DialogResult.No;
////////////////////////////////////////////////////////////////////////////////
public static DialogResult Show(string Text, string Caption, string btnOK, string btnCancel)
{
     MsgBox = new CustomMsgBox();
     MsgBox.label1.Text = Text;
     MsgBox.button1.Text = btnOK;
     MsgBox.button2.Text = btnCancel;
     MsgBox.Text = Caption;
     result = DialogResult.No;
     MsgBox.ShowDialog();
     return result;
}
////////////////////////////////////////////////////////////////////////////////
result = DialogResult.Yes; MsgBox.Close();

Это руководство может оказаться полезным для вас.

И эта ссылка для изменения размера и положения формы окна

person Krishna Bankar    schedule 21.04.2021
comment
Окно сообщения было просто примером того, что приложение Wonderware Application Server может получить доступ к некоторым функциям System.Windows.Forms в своих сценариях QuickScript.NET. Библиотека Windows Forms (system.windows.forms.dll) была импортирована в приложение Wonderware Application Server. Сценарий будет работать в открытом окне, и я хотел бы изменить его размер, но я не могу заставить функцию размера .Net работать в QuickScript.NET. - person Tanquen; 21.04.2021
comment
Ладно, подумаю еще кое о чем. - person Krishna Bankar; 21.04.2021

Если вы хотите побаловаться с использованием библиотек функций сценария, вы можете написать утилиту для расширения графики.

Я получил оригинальное руководство с этого сайта, если вы ищете расширяемые всплывающие окна в Wonderware ArchestrA. но похоже, что они перемещают свои уроки за страницу регистрации.

№1. Создайте библиотеку функций сценария.
Я написал очень простую библиотеку классов в Visual Studio, используя C#, которая выглядит следующим образом:

public class ResizableForm
{
    [DllImport("user32.dll")]
    public static extern IntPtr GetForegroundWindow();

    public Form GetCurrentWindow()
    {
        IntPtr activeWindowHandle = GetForegroundWindow();
        Form f = Control.FromHandle(activeWindowHandle) as Form;
        return f;
    }
}

№2. Импорт в ArchestrA
В главном окне IDE: Galaxy -> Import -> Script Function Library...
Затем выберите .dll, который вы создали из #1.

#3. Графический сценарий ArchestrA
При вызове изображения, размер которого нужно изменить, убедитесь, что вы задаете для него явную ширину/высоту, после чего вы сможете динамически изменять его размер, помещая что-либо в запустить такой скрипт:

Dim myLib As ResizableForm;
Dim myGfc As System.Windows.Forms.Form;

myLib = new ResizableForm();
myGfc = myLib.GetCurrentWindow();

myGfc.Width = #;
myGfc.Height = #;

... и я думаю, что это все. Надеюсь, это продвинет вас достаточно далеко, чтобы вы могли поиграть с остальными. Я рекомендую ознакомиться с учебным пособием на сайте EverDyn для получения лучших примеров/деталей.

РЕДАКТИРОВАТЬ: Думаю, я должен просто упомянуть, что вызов GetCurrentWindow() очень мощен в графике ArchestrA. Я использую другой сценарий, чтобы получить дескриптор текущей графики и вызвать некоторые функции .NET для печати текущего окна на динамически выбранном принтере, чтобы мои клиенты могли создавать ярлыки, чтобы приклеивать их к вещам. По сути, если вы можете получить дескриптор формы из этой функции, вы можете использовать большинство библиотек .NET, чтобы манипулировать ею так, как вы хотите. Удачи!


КОД РЕДАКТИРОВАТЬ СОГЛАСНО КОММЕНТАРИИ:

try
  dim formID as System.IntPtr;
  dim currentForm as System.Windows.Forms.Form;

  formID = ClassLibraryROB4.ResizableForm.GetForegroundWindow();
  currentForm = System.Windows.Forms.Control.FromHandle(formID);

  currentForm.Width = #;
  currentForm.Height = #;
catch
  LogError(error);
endtry;

  
person Grambot    schedule 22.04.2021
comment
Я посмотрю, как только смогу, и это звучит хорошо, но это может не сработать. Чтобы добавить сложности, это приложение System Platform 2020 R2 OMI, и ряд вещей не работает в OMI. Команда ShowGraphic должна иметь возможность просто заменить открытое окно таким же окном с новым размером, но свойство Identity больше не работает, и вы не можете закрыть окно с помощью скрипта. Им нужно это исправить. Другие функции, такие как GetCurrentWindow(), я думаю, также не поддерживаются в InTouch OMI. :( Вот почему я надеялся, что функция .Net Size может работать. - person Tanquen; 23.04.2021
comment
Уф, это две большие проблемы, которые не позволят мне перейти с 2017u2 на 2020. Вы говорили с кем-нибудь из техподдержки AVEVA, чтобы узнать, есть ли у них решения? - person Grambot; 27.04.2021
comment
Это в основном потому, что они привязаны только к OMI. Только в 2020R2 OMI могла даже получить доступ к роли и уровню доступа вошедших в систему пользователей. :) Не могу найти руководство на сайте Everdyn. У меня есть MS Visual Studio, но я понятия не имею, как его использовать, какой тип библиотеки и как сделать DLL. Наша местная поддержка представителей не хочет даже смотреть на это. Все еще хотел бы дать ему шанс, если у вас есть какие-либо указатели. - person Tanquen; 28.04.2021
comment
Если вы перейдете по моей ссылке в ответе выше, прокрутите вниз, затем перейдите на страницу № 4, и вы найдете там ссылку на статью. Прямая ссылка: everdyn.com/single -post/2013/03/21/ Если вы погуглите, создав библиотеку классов в Visual Studio, вы получите лучшее руководство, чем все, что я могу написать на StackOverflow. По сути, вы просто создаете файл .dll, который можно импортировать с помощью Archestra. - person Grambot; 03.05.2021
comment
Хорошо, Visual Studio имеет около 20 различных шаблонов библиотеки классов. Вы сказали C#, поэтому я сделал библиотеку Class с логотипом C#. Затем долгосрочная поддержка .Net Core 3.1. Но я получаю ошибки, добавил информацию в свой ОП. - person Tanquen; 06.05.2021
comment
Код на шаге 3 не работает. Неизвестный тип: ResizableForm - person Tanquen; 06.05.2021
comment
Скорее всего, вам нужно будет адресовать его как WinFormsLibraryRB.ResizableForm, так как он находится в пространстве имен WinFormsLibraryRB. Посмотрите, работает ли это? - person Grambot; 06.05.2021
comment
Могу ли я удалить NameSpace из кода DLL? Пример everdyn мало что говорит о DLL. Они используют Dim MyWindowManipulation AS Everdyn.WindowManipulation;, поэтому пространство имен — Everdyn, но WindowManipulatio отсутствует в их DLL-коде. После Dim они используют MyWindowManipulation.GetCurrentWindow. WinFormsLibraryRB.ResizableForm по-прежнему говорит «Неизвестный тип». Возможно, библиотека классов Windows Forms является неправильным шаблоном, - person Tanquen; 06.05.2021
comment
Я думаю, вы можете удалить пространство имен. Я честно не знаю. Другая часть, которую нужно проверить, находится в свойствах вашего проекта, держу пари, там есть запись пространства имен по умолчанию. Я не думаю, что вам нужна библиотека классов Windows Forms, единственный вариант в моей Visual Studio (2019) — это библиотека классов. Ознакомьтесь с этим учебным пособием по созданию библиотек классов, оно может вам помочь: Учебное пособие: docs.microsoft.com/en-us/dotnet/core/tutorials/ - person Grambot; 06.05.2021
comment
Текущая проблема заключается в том, какой шаблон Visual Studio (2019) использовать? Я вижу страницы вариантов. Вы сказали, что есть только один, вы начинаете с Создать новый проект? Изображение части списка добавлено в ОП. Я попытался, я думаю, просто библиотеку классов С#, но это не позволило мне добавить использование System.Windows.Forms; и без этого вы получите ошибки. Шаблон библиотеки классов Windows Forms позволяет мне добавлять Win Forms с помощью, чтобы не возникало ошибок при создании dll, но в системную платформу не добавлялись никакие функции. - person Tanquen; 07.05.2021
comment
plctalk.net/qanda/showthread.php?t=114301 нашел эту ветку о получении функции на системной платформе, и она работала с использованием библиотеки классов (.NET Framework), но также не может использовать использование System.Windows.Forms; строка в коде. Но он добавляет функцию в системную платформу. - person Tanquen; 07.05.2021
comment
Я обнаружил, что вы можете добавить ссылку на System.Windows.Forms в шаблон библиотеки классов (.NET Framework). Итак, получите dll, которую я могу импортировать в системную платформу, и она указана в обозревателе функций сценария, и в сценарии нет ошибок, но во время выполнения ничего не происходит, когда используется кнопка со сценарием, и это находится в журнале SMC: выполнение сценария exception.Message: для нестатического метода требуется цель.. System.Reflection.TargetException: для нестатического метода требуется цель. - person Tanquen; 07.05.2021
comment
Я получил этот пример plctalk.net/qanda/showthread.php?t=114301 работать, но только после того, как класс и int станут статическими в Visual Stuido. Как статический общедоступный класс DemoClass, но DIM в сценарии системной платформы больше не работает. Итак, это работает: Me.intTest = demo.DemoClass.GetAdd( 2, 3 ); Но у этого есть ошибка, говорящая, что у cls нет функции GetAdd. dim cls как demo.DemoClass; Me.intTest = cls.GetAdd(2,3); - person Tanquen; 07.05.2021
comment
Я думаю, что вы приближаетесь, но пошли по неправильному пути, используя идентификатор класса static. Как только вы скомпилируете его, вы вернетесь к использованию DIM varname AS ClassName; varname = new ClassName(); varname.function();. Идентификатор static делает так, что вы можете пропустить создание экземпляра класса (строки dim и = new Class();, но я никогда не играл со статическими функциями в Wonderware, чтобы помочь. Одна вещь, которую вы может попробовать обернуть ваш код в try <code> catch LogError(error); endtry;, чтобы увидеть, регистрирует ли SMC, почему ему не нравится ваш код - person Grambot; 07.05.2021
comment
Я приближаюсь, но странно, что ваш код и очень простой пример, который я нашел, вызывают нестатический метод, требующий целевой ошибки. Погуглил что вроде бы когда у тебя пустой параметр или функция но не знаю. Поскольку в ошибке упоминается статика, я попытался добавить это в код, но ни один из вас не говорит об этом. Я использую неправильный шаблон библиотеки в Visual Studio или что-то изменилось в System Platform? Я знаю, что это большой шок, но я не могу добавить try-catch без ошибок в Visual Studio. :( Или это должно быть в сценарии системной платформы? - person Tanquen; 08.05.2021
comment
Хорошо, я удалил статические идентификаторы в Visual Studio, и я добавил функцию try в скрипт тестовой кнопки в System Platform, и это та же ошибка в SMC, но теперь это красная ошибка, а без функции Try-Catch это война. Я добавил полные ошибки в OP, - person Tanquen; 08.05.2021
comment
Я думаю, вы очень близко! Вам нужно добавить cls = new ClassLibraryDemo.DemoClass(); после объявления (строка, начинающаяся с dim cls). - person Grambot; 11.05.2021
comment
Спасибо, что придерживаетесь этого. Демонстрационный пример теперь работает, но это странно, поскольку в потоке с примером даже есть снимок экрана с работающим кодом и изменением значения, но в нем нет строки cls = new. ??? К сожалению, ваш код, который мне нужен, все еще имеет ту же нестатическую ошибку, и в нем уже есть новая строка после Dim myLib = new ResizableForm();. Разве компьютеры не забавны? :( - person Tanquen; 11.05.2021
comment
Я попытался добавить новое в 'myGfc = myLib.GetCurrentWindow();' строка, но System Platform просто выдает ошибку Type Not Found. - person Tanquen; 11.05.2021
comment
Вы импортировали System.Windows.Forms.dll как библиотеку функций сценария? Он должен уже существовать на вашем компьютере (он поставляется с установкой .NET), но вам придется импортировать его как часть Galaxy, чтобы он работал. Его легко пропустить, но он упоминается в этом руководстве EverDyn. - person Grambot; 11.05.2021
comment
Да, я импортировал его некоторое время назад, чтобы использовать окно сообщения в приложении. Хм... Я все это делаю на тестовой ВМ, может не импортировал System.Windows.Forms.dll, утром проверю. - person Tanquen; 12.05.2021
comment
Возможно, моя способность помочь иссякает. Если вы завернете весь свой скрипт в блок try-catch (включая объявления переменных), вы, надеюсь, получите реальную ошибку в журнале SMC до того, как она столкнется с этим исключением (что больше похоже на проблему в системе ArchestrA, а не на что-то в вашем коде). ). Можете ли вы опубликовать свой полный сценарий кнопки в вопросе? Я беспокоюсь, что мы столкнулись с одним из классических гремлинов Wonderware. - person Grambot; 12.05.2021
comment
Но это то, что вы используете или использовали раньше? На днях я обновил OP, и в нем есть код Visual Studio и скрипт System Platform для простой демонстрации и кода, который вы опубликовали. Я уверен, что System.Windows.Forms.dll был импортирован, поскольку системная платформа автоматически заполняет System.Windows.Forms.Form; как я печатаю это. Я попробую Try-Catch еще раз. - person Tanquen; 12.05.2021
comment
Я добавил try-catch в сценарий кнопки и получил ошибку в вопросе. - person Tanquen; 12.05.2021
comment
Последнее предложение - попробовать слегка измененную версию этого; код, вставленный в мой ответ, но если это не сработает, я думаю, что это все, что я могу сделать. Мне жаль, что это не работает. Код вашей библиотеки классов идентичен моему. Даже ваш код скрипта ArchestrA практически идентичен. На данный момент проблема должна заключаться в более новой версии Wonderware. В моей компании есть проект, который в настоящее время выполняется в 2020 году, поэтому я надеюсь, что вскоре получу в свои руки программное обеспечение и смогу устранить неполадки на месте. Может быть, тогда я смогу подсказать. - person Grambot; 12.05.2021
comment
Я получаю ту же ошибку, это облом. Спасибо за попытку. Кажется, что это может сработать, но я не понимаю, в чем заключается текущая проблема 2020 R2. Кажется, что-то изменилось, так как простая добавленная DLL должна была изменить сценарий, чтобы передать то же сообщение об ошибке. На какой версии он у вас работает. Я думаю, что у меня есть доступ к 2017 и 2014 годам. Может, если у меня это работает в старой версии, я могу получить поддержку по ошибкам. - person Tanquen; 12.05.2021
comment
Определенно работает в 2014 году, на котором работает мой клиент. У меня есть 2017 на виртуальной машине, которую я могу протестировать позже и отчитаться. - person Grambot; 13.05.2021
comment
Мне удалось откопать старую виртуальную машину 2014 R2 SP1, и обе библиотеки DLL и скрипт ведут себя так же, как 2020 R2. Не уверен, что мне не хватает. ??? :( Я не знаю, как они заставили эту простую добавленную DLL и скрипт работать без строки cls = new ClassLibraryDemo.DemoClass();. - person Tanquen; 14.05.2021
comment
Вы точно знаете, какая строка сценария ArchestrA выдает исключение? Может быть, мы можем сузить круг и выяснить? Еще одна вещь, о которой мне было интересно, когда вы обновляли/публиковали новые библиотеки DLL для своей библиотеки классов, обновляли ли вы номера версий? Мне интересно, сохранила ли Wonderware предыдущую копию каким-то образом. - person Grambot; 14.05.2021
comment
Я задавался вопросом об обновлениях DLL и видел сообщения о том, как вам нужно изменить версию DLL, чтобы обновить IDE. Виртуальная машина 2020 R2 спросила, хочу ли я заменить текущую DLL, возможно, что-то новое, или я изменил достаточно в Visual Studio, чтобы вызвать новую версию. На виртуальной машине 2014 года его никогда не было, и я импортировал последнюю DLL с кодом из OP. Не так много строк, которые нужно закомментировать, а не просто сделать недействительным сценарий системной платформы. Это должны быть объекты myLib или myGfc, которые, по его мнению, определены неправильно. Подобно простой добавленной DLL, пока не будет добавлен cls = new.... - person Tanquen; 14.05.2021
comment
Если я закомментирую myGfc.Width и myGfc.Height, ошибки не будет, но ничего не произойдет. - person Tanquen; 14.05.2021
comment
Может быть, что-то не так с библиотекой Class или нужной ей user32.dll? Мне было бы любопытно увидеть/узнать больше о рабочей версии, которая у вас есть в 2014 году. Возможно, ОС, на которой она работает, имеет значение. - person Tanquen; 25.05.2021