Снегопат
https://snegopat.ru/forum/

Помогите макрос написать Установка пароля на модуль
https://snegopat.ru/forum/viewtopic.php?f=3&t=237
Страница 1 из 2

Автор:  vladnet [ 10 авг 2012, 14:21 ]
Заголовок сообщения:  Помогите макрос написать Установка пароля на модуль

В трассировке команду нашел:

cmd: groupid={EF6D156B-12FB-4CE7-A0E9-7F0C2EDC7D06}, num=0, param=0, object=0x00000000

Первый вопрос, как вызвать ее? И второй вопрос, выйдет стандартная форма, как в ней то поля заполнить и ОК нажать?

Автор:  orefkov [ 10 авг 2012, 14:36 ]
Заголовок сообщения:  Re: Помогите макрос написать Установка пароля на модуль

Команду послать:
Код:
sendCommand("{EF6D156B-12FB-4CE7-A0E9-7F0C2EDC7D06}", 0)

Для работы с диалогами сделай поиск по папке csripts фразы
Код:
events.connect(windows, "onDoModal"

Автор:  vladnet [ 10 авг 2012, 17:08 ]
Заголовок сообщения:  Re: Помогите макрос написать Установка пароля на модуль

Команда работает спасибо.
А вот с диалогом не разобрался. Мне нужно только в рамках действия данного скрипта диалог гасить.

То есть по сути мне не нужно событие перехватывать. Но возникает странная ситуация, если перехватываю событие, то вот эта строка отрабатывает 2 раза и в форме установки пароля и уже после выхода из формы в модуле

new ActiveXObject("WScript.Shell").SendKeys("pass{TAB}pass{TAB}{ENTER}")

а если просто после sendCommand("{EF6D156B-12FB-4CE7-A0E9-7F0C2EDC7D06}", 0)

то только 1 раз. как быть?

Автор:  sosnae [ 10 авг 2012, 17:18 ]
Заголовок сообщения:  Re: Помогите макрос написать Установка пароля на модуль

Проверяй состояние модального диалога, их вроде три "перед", "открыто модальное окно", "после"
Код:
function onMessageBoxSaveToFileCF(dlgInfo) {
    //Модальное окно открыто.
    if ((dlgInfo.stage == openModalWnd) && (dlgInfo.Caption=="Конфигуратор")) {
        // тут sendkey
    } else {
        if ((dlgInfo.stage == afterDoModal) && (dlgInfo.Caption=="Конфигуратор")) {
            //после модального окна, тут я отключаюсь от события.
            try {
                events.disconnect(windows, "onDoModal", SelfScript.self, "onMessageBoxSaveToFileCF");
             } catch (e) { }
            }
        }
}

Автор:  vladnet [ 10 авг 2012, 17:24 ]
Заголовок сообщения:  Re: Помогите макрос написать Установка пароля на модуль

попробую спасибо, сразу не понял что это за условия )

Автор:  vladnet [ 10 авг 2012, 17:41 ]
Заголовок сообщения:  Re: Помогите макрос написать Установка пароля на модуль

в общем так сделал

Код:
var мВызовИзМакроса = false

events.connect(windows, "onDoModal", SelfScript.self, "onMessageBoxSetPassword");

function macrosУстановитьПароль()
{
   мВызовИзМакроса = true
   sendCommand("{EF6D156B-12FB-4CE7-A0E9-7F0C2EDC7D06}", 0)
   мВызовИзМакроса = false
}

function onMessageBoxSetPassword(dlgInfo) {
    if ((dlgInfo.stage==openModalWnd) && (dlgInfo.Caption=="Защита модуля") && (мВызовИзМакроса==true)){
      new ActiveXObject("WScript.Shell").SendKeys("pass{TAB}pass{TAB}{ENTER}");
    }
}


Только проблема не исчезла, все равно не туда клавиши улетают. Причем если вызов не из макроса, то убрать условие что вызов только от туда то клавиши улетают нормально ( так же нормально если на модуле уже стоит пароль, после ввода старого пароля, клавиши улетают туда куда нужно ...

Автор:  orefkov [ 10 авг 2012, 20:25 ]
Заголовок сообщения:  Re: Помогите макрос написать Установка пароля на модуль

Код:
function macrosУстановитьПароль()
{
   events.connect(windows, "onDoModal", SelfScript.self, "onMessageBoxSetPassword");
   sendCommand("{EF6D156B-12FB-4CE7-A0E9-7F0C2EDC7D06}", 0)
}

function onMessageBoxSetPassword(dlgInfo) {
    if (dlgInfo.stage==openModalWnd && dlgInfo.Caption=="Защита модуля"){
      events.disconnect(windows, "onDoModal", SelfScript.self, "onMessageBoxSetPassword");
      // Вот тут надо узнать имена контролов и значения в них устанавливать вот так
      dlgInfo.form.getControl("ТутИмяКонтролаСПаролем").value="pass";
      dlgInfo.form.getControl("ТутИмяДругогоКонтролаСПаролем").value="pass";
      new ActiveXObject("WScript.Shell").SendKeys("^~"); // Ctrl+Enter
    }
}

Имя контролов можно получить, перебрав один раз все контролы, через form.getControl(i) для i от 0 до form.ControlsCount, у каждого есть свойство name.

Автор:  artbear [ 11 авг 2012, 10:19 ]
Заголовок сообщения:  Re: Помогите макрос написать Установка пароля на модуль

orefkov писал(а):
Имя контролов можно получить, перебрав один раз все контролы, через form.getControl(i) для i от 0 до form.ControlsCount, у каждого есть свойство name.

(0) В дополнение вот тебе готовый код для перебора (уже выкладывался ранее)
Код:
   if(dlgInfo.stage == openModalWnd)
   {
      Message(dlgInfo.Caption);
      // Пример перебора контролов на форме
      //Message("HWND = 0x" + dlgInfo.form.hwnd.toString(16));
      for(var c = 0; c < dlgInfo.form.controlsCount; c++)
      {
         var ctr = dlgInfo.form.getControl(c)
         Message(ctr.name + ",   " + ctr.id + ",   " + ctr.value)
      }
   }

Автор:  vladnet [ 14 авг 2012, 17:55 ]
Заголовок сообщения:  Re: Помогите макрос написать Установка пароля на модуль

Александр, спасибо огромное за наводку в нужную сторону, понятно что так намного правильнее сделать.
Перебор тоже кстати пригодился )

Да вопрос на будущее, а как на кнопку нажать без того чтобы посылать клавиши, ведь по сути контрол то мы можем получить...

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

Да кому надо выкладываю
Код:
$engine JScript
$uname my_macros
$dname Мои макросы
$addin global
$addin stdcommands
$addin stdlib

var мВызовИзМакроса = false

events.connect(windows, "onDoModal", SelfScript.self, "onMessageBoxSetPassword");

//////////////////////////////////////////////////////////////////////////////////////
////{ Макросы
////
function macrosОткрытьМодульОбъекта()
{
   //debugger
    try
    {
        windows.getActiveView().mdObj.editProperty("МодульОбъекта");
        return true
    }catch(e){}
    return false
}

function macrosОткрытьОсновнуюФорму()
{
    try
    {
      var mdObj = windows.getActiveView().mdObj
      var mainForm = mdObj.container.findByUUID(stdlib.getUuidFomMDRef(mdObj.property("ОсновнаяФорма")))
      mainForm.editProperty("Форма")
        return true
    }catch(e){}
    return false
}

function macrosУстановитьПароль()
{
   мВызовИзМакроса = true
   sendCommand("{EF6D156B-12FB-4CE7-A0E9-7F0C2EDC7D06}", 0)
   мВызовИзМакроса = false
}

function onMessageBoxSetPassword(dlgInfo) {
    if ((dlgInfo.stage==openModalWnd) && (dlgInfo.Caption=="Защита модуля") && (мВызовИзМакроса==true)){
      dlgInfo.form.getControl("Password").value="pass";
      dlgInfo.form.getControl("ConfirmPassword").value="pass";
      
       new ActiveXObject("WScript.Shell").SendKeys("^~"); // Ctrl+Enter
   }
}

Автор:  sosnae [ 15 авг 2012, 09:32 ]
Заголовок сообщения:  Re: Помогите макрос написать Установка пароля на модуль

А оформить скриптом и вики?

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/