Обсуждение:Умный консольный робот (автоматическое закрытие опердня, ревизия, запуск остановка приложений по расписанию и все все все, что можно описать на rsl)
5 (1)
Обсуждение:Умный консольный робот (автоматическое закрытие опердня, ревизия, запуск остановка приложений по расписанию и все все все, что можно описать на rsl) ( Обсуждение примера 04.09.2005 06:48 )
5(2)Есть много клавиатурных роботов. Они могут нажимать клавиши и многое другое делать, очень удобно. Но более сложные задачи, где требуется хоть малейший анализ сообщений на экране им не под силу. Вот и есть такая идея. Сделать робота, который бы мог управлять консольным окном (нажимать клавиши) и читать, что там написано. Т.е. была бы возможность не только воздействия робота на управляемое приложение, но и чтобы приложение могло воздействовать на поведение робота. Чтобы робот не просто тупо нажимал клавиши, но и мог анализировать поведение программы (например обрабатывать сообщения об ошибках или дожидаться пока выполнится заданное действие) и соответствующим образом на это реагировать. Для универсальности алгоритм работы робота лучше задавать на некотором языке программирования (скрипт).
Лучший язык по мнению R-Style это RSL.
Так вот, берем RSL производства R-Style и OLE сервер собственной конструкции.
Вместо RSL от RSBank лучше взять rsrti.exe, чтобы к словарям и RS-Bankам не быть привязанным.
А OLE сервер делаем сами, со следующим функционалом:
• Создавать консоль и запускать в ней командный процессор.
• Нажимать клавиши
• Читать, что написано на экране.
Далее из макроса выполняемого из под RSL через механизм OLE будем управлять нашей консолью.
В приложенном архиве:
t_crobot.mac -набор макропроцедур для работы с OLE сервером
t_retailcloseday.mac -пример закрытия опердня в retail
t_revision.mac -пример ревизии файлов дня в RS-Bank 5.0
t_server.exe -Сам оле-сервер
"Умный консольный робот.doc" -Краткая документация
Исходники сервера, rsrti.exe и полная версия макросов выложены на http://212.94.116.242/opito/t_robot.rar . Сюда не входит.
Посмотреть пример
>> ОтветитьПлиз, пошли мне на майл ( dzuki 06.09.2005 23:24 )
0(0)zaur@bankstandard.com
>> ОтветитьИ мне если можно ( AStrejenov 13.09.2005 07:51 )
0(0)очень уж интересная вещь. azizd@rin.ru
>> Ответитьмне пришлось ввести поправки в код t_robot.mac ( grave 13.09.2005 16:53 )
0(0)чтобы поиск строки на экране осуществлялся нечуствительным к регистру..
позже может еще какие пожелания скажу.
идея отличная - тестирую.
>> ОтветитьЯ у себя уже поменял :-) ( tvs54 13.09.2005 16:57 )
3(1)И еще поставил задержку при нажатии клавиши, а то некорректно отрабатыват при нескольких последовательных коммандах VK.
>> Ответитьеще вопрос. ( grave 21.09.2005 10:30 )
0(0)ма-аленький.
что-то не могу сообразить, как послать в консоль Alt+X.
чувствую, тут будет dwControlKeyState участвовать.. а вот как?
>> ОтветитьwControlKeyState ( tvs54 21.09.2005 10:39 )
0(0)wControlKeyState
Indicates the state of the control keys. This member can be a combination of the following values:
Value Meaning
CAPSLOCK_ON The CAPS LOCK light is on.
ENHANCED_KEY The key is enhanced.
LEFT_ALT_PRESSED The left ALT key is pressed.
LEFT_CTRL_PRESSED The left CTRL key is pressed.
NUMLOCK_ON The NUM LOCK light is on.
RIGHT_ALT_PRESSED The right ALT key is pressed.
RIGHT_CTRL_PRESSED The right CTRL key is pressed.
SCROLLLOCK_ON The SCROLL LOCK light is on.
SHIFT_PRESSED The SHIFT key is pressed.
// ControlKeyState flags
//
#define RIGHT_ALT_PRESSED 0x0001 // the right alt key is pressed.
#define LEFT_ALT_PRESSED 0x0002 // the left alt key is pressed.
#define RIGHT_CTRL_PRESSED 0x0004 // the right ctrl key is pressed.
#define LEFT_CTRL_PRESSED 0x0008 // the left ctrl key is pressed.
#define SHIFT_PRESSED 0x0010 // the shift key is pressed.
#define NUMLOCK_ON 0x0020 // the numlock light is on.
#define SCROLLLOCK_ON 0x0040 // the scrolllock light is on.
#define CAPSLOCK_ON 0x0080 // the capslock light is on.
#define ENHANCED_KEY 0x0100 // the key is enhanced.
#define NLS_DBCSCHAR 0x00010000 // DBCS for JPN: SBCS/DBCS mode.
#define NLS_ALPHANUMERIC 0x00000000 // DBCS for JPN: Alphanumeric mode.
#define NLS_KATAKANA 0x00020000 // DBCS for JPN: Katakana mode.
#define NLS_HIRAGANA 0x00040000 // DBCS for JPN: Hiragana mode.
#define NLS_ROMAN 0x00400000 // DBCS for JPN: Roman/Noroman mode.
#define NLS_IME_CONVERSION 0x00800000 // DBCS for JPN: IME conversion.
#define NLS_IME_DISABLE 0x20000000 // DBCS for JPN: IME enable/disable.
>> Ответитьпонятно. следующая фенька ( grave 21.09.2005 11:21 )
0(0)понятно. следующая фенька - установка свойства title окна. у нас поиск окон планировщиком осуществляется по заголовку. а там только такое - f:\services\robot\t_server.exe /Automation rscbb.exe /s .... их (окон) у меня несколько таких будет.
>> Ответитьа зачем планировшик???? ( tvs54 21.09.2005 11:26 )
0(0)Можно же на rsl написать обработку по времени и рулить несколькими окнами из одного макроса. Я так делаю.
Типа того.....
olex = T_CRobot_Create();
oley = T_CRobot_Create();
T_CRobot_PutStr(olex, "f:\rcd f:\\clbb500\\obj\r rsb2cb");
T_CRobot_PutVK(olex, VK_RETURN);
T_CRobot_PutStr(olex, "f:\rcd f:\\clbb500\\obj\r rscbb");
T_CRobot_PutVK(olex, VK_RETURN);
...................................................................
>> Ответитьхм, вариант. ( grave 21.09.2005 11:41 )
0(0)у нас планировщик периодически проверяет наличие окон на экране.. ваш вариант несет плюсы в себе - так, навскидку, - имеем массив классов, класс знает что за задачу запускать, во сколько и до скольки, как проверять ее активность (не встала ли она), с какой периодичностью, что делать если окна нет или прогу вышибло чем-нибудь. и периодически сканировать наш массив на активность и тд. только все это получается одинм макросом делать - в вечном цикле.. этот планировщик с точки зрения надежности проигрывает. вот вышибет его - и что тогда? ))
но вариант соблазнительный. думаю.
>> ОтветитьЯ делал робота именно для завершения опердня. ( tvs54 21.09.2005 11:59 )
0(0)Алгоритм такой, макрос работает круглосуточно и в заданое время выкидывает всех пользователей с сервера БД и закрывает день, о результатах уходит SMS. Если во время не пришло сообщение -надо проверять! Пока проблем небыло.
А в принципе заголовок окна сменить легко: SetConsoleTitle(LPCTSTR lpConsoleTitle);
Добавить еще одно свойство в t_robot...Надо?
>> Ответить
Пожалуйста, вышлите мне на email, - очень заинтересовало! ( Пепелац 23.09.2005 15:33 )
0(0)Пожалуйста, вышлите мне на email ( VEA 25.09.2005 09:19 )
0(0)А ссылка наверху в этой ветке для кого?(-) ( Дмитрий В 26.09.2005 08:27 )
0(0)Not specified
>> Ответить
Пожалуйста, вышлите мне тоже на email, - хочется попробовать! ( СЕН 26.09.2005 13:23 )
0(0)Вроде всем выслал ( tvs54 27.09.2005 09:10 )
0(0)Not specified
>> ОтветитьHelp!!! Ничего не получил ( СЕН 27.09.2005 10:14 )
0(0)Можно повторить отпрвку?
>> ОтветитьВот теперь получил ,спасибо ( СЕН 27.09.2005 13:42 )
0(0)Not specified
>> Ответить
Мне, пожалуйста, тоже вышли. ( moleg 28.09.2005 04:31 )
0(0)Not specified
>> Ответитьследующее пожелание ). событие закрытия окна ( grave 30.09.2005 07:43 )
0(0)возможно ли вызвать.. хотя вызвать - вряд ли. Как из макроса безболезненно узнать о том, что окно было закрыто?
>> Ответитьнадо подумать ( tvs54 03.10.2005 14:18 )
0(0)Not specified
>> Ответить
Клёво! А у меня миниробот был организован на java script! Зашли на мыло, плизз! ( arhmoder 05.10.2005 17:12 )
0(0)yuriy@rw.arh.ru
>> Ответитьможно мне тоже прислать на мыло? ( BRV29a 20.10.2005 12:03 )
0(0)brv@trustcombank.ru
>> Ответить
пришлите пож. и мне на мыло ( BRV29a 20.10.2005 12:05 )
0(0)brv@trustcombank.ru
>> Ответитьпришлите пож. и мне на мыло ( aab 21.10.2005 13:40 )
0(0)email: a_abdugani@yahoo.com
>> Ответить
Ну уж и мне тогда вышли чтоли. ( LeonL 03.11.2005 11:40 )
0(0)Not specified
>> ОтветитьИзвините, что протянул с ответом. Архив выложен на http://212.94.116.242/opito/t_robot.rar ( tvs54 08.11.2005 07:58 )
0(0)А нет такого адреса... ( SpbSofiaShpilev 13.06.2006 17:04 )
0(0)Пришлите, пожалуйста, мне на е-мейл yshpilev@sofia.spb.ru
>> Ответить
особенности DOS-задачи ( grave 08.11.2005 10:17 )
2(1)Есть программа, написанная давным-давно, программа 16-тибитная.
Для ее запуска система использует что-то вроде эмулятора ntvdm.exe. Нашим имеющимся планировщиком мы можем отслеживать наличие задачи по имеющемуся окну. - есть окно с нашим названием - значит задача висит на экране.
Роботу я хотел доверить слежение за несколькими постоянно висящими задачами.
я проверял активность задач, запущенных роботом, с помощью PID задачи - есть такой процесс - значит все ок. я получал от робота PID консоли, искал процесс с путем, совпадающим с путем моей задачи, и если PID родителя задачи==PID консоли, то можно было поверить, что это процесс, запущенный роботом.
в случае с 16-тибитной задачей путь не совпал, ибо путь реально работающего процесса был не .... zadacha.exe а ....ntvdm.exe. и нигде "рядом" с ним zadacha.exe я не обнаружил.
тогда я "научил" робота менять титл консоли, но и это не спасло положение - ибо при закрытии самой программы консоль вместе со своим титлом оставалась на экране и робот думал что все в порядке. Глубоко вздохнув и запасясь терпением я стал получать PID последнего дочернкго процесса от PID консоли - то есть собственно PID моего zadacha.exe, путем у которого значится ntvdm.exe. Запустил. Вырубаю программу (эмулирую случайное вмешательство). Но робот задачу не перезапускает. Глянув в диспетчер, я обнаружил что закрытие программы никак не повлияло на эмулятор ntvdm.exe - он не выгрузился и продолжал висеть.
Может быть есть какие-либо параметры запуска DOS-приложений, которые могут мне помочь?
>> ОтветитьШтука вроде хорошая но у меня почемуто работает криво (с кодировкой какието проблемы) ( LeonL 22.06.2006 13:27 )
0(0)Вот такой экран считывается. Почему непойму подскажите люди добрые,
GetConsoleCP() и GetConsoleOutputCP() = 866, а кодировка китайская какаято.
-------------------------??????????????????????????????┐------------------------
-------------------------? ?------------------------
-------------------------? В??д??? Ва? ном?? 0 ?------------------------
-------------------------? ?------------------------
-------------------------???????????????????????????????------------------------
-----------------???ома??з??о?анна? ?ан?о???а? ?????ма RS-Bank------------------
--------------------------------- ???????а??? ----------------------------------
-----------------Copyright (c) 1993 - 2005 R-Style Software Lab-----------------
------------------------------В?????: 5.00.086.22 ------------------------------
--------------------------------------------------------------------------------
-------------------------????а??онн?й д?н? : 22.06.2006-------------------------
--------------------------С????мна? да?а : 22.06.2006---------------------------
>> ОтветитьДля того чтобы это все работало, необходимо ( tvs54 22.06.2006 14:36 )
2(1)Для того чтобы это все работало, необходимо в свойствах управляемого окна выставить не растровый шрифт Lucida Console и изменить ярлык для запуска этого окна, как показано на рисунках ниже (лучше это сделать один раз при первом запуске робота на конкретной машине). Если этого не сделать то робот не будет нормально читать русские буквы с консоли (во всяком случае, половину из них).
>> Ответить
А к 5.5 кто-нибудь пытался прикрутить? ( sokols 06.09.2011 12:19 )
5(1)Not specified
>> ОтветитьУ нас закрывает на 5.50.002.30 ( tvs54 06.09.2011 12:32 )
0(0)только макрос немного откорректировали, чтоб рс через трехзвенку запускал
>> ОтветитьА можно макрос расшарить? :-) Или на мыло ( sokols 06.09.2011 12:45 )
0(0)ОТПРАВИЛ ( tvs54 06.09.2011 13:29 )
0(0)Not specified
>> ОтветитьСпасибо, получил ( sokols 06.09.2011 13:34 )
0(0)Not specified
>> Ответить