Win32 Hook и Lotus Notes

Тема в разделе "Lotus - Программирование", создана пользователем wk01, 27 окт 2010.

  1. wk01

    wk01 Active Member

    Регистрация:
    8 май 2010
    Сообщения:
    31
    Симпатии:
    0
    доброго всем дня!
    Итак, задача: есть лотусовая БД, и с ней всё хорошо. не хорошо с её пользователями, они - бапки (во всех смыслах этого слова). эти пользователи N лет работали с подобной по функционалу нелотусовой БД, в которой на основные операции были забиндены кнопки: F2, F3, shift+F3, F4, F5, .... и так получилось, что этим пользователям при переходе на новую платформу всё пофиг, кроме этих жалких кнопарей. и вот хоть трава не расти, но создавать новые записи они хотят по F2, а чего-то ещё делать - по F5 и т.д. И ни мышку не признают, ни другие способы запуска экшенов.

    Пошарил в хелпе события юзерного лотусового интерфейса - нету нигде ничего про отлов жмяканья по клаве. Почитал форум и интернеты, везде на подобные темы один ответ - юзай хук (на этом форуме формулировка ещё категоричней: юзай хук, если всё получится - не забудь нам показать!). Поделиться с ближним я всегда не против, было б чем!

    Стал искать инфу про хуки, нашёл. Отлично, думаю, заюзаю user32.dll, функции SetWindowsHookEx, UnhookWindowsHookEx, CallNextHookEx. Все детали использования, передаваемые параметры расписаны - всё вроде бы супер! Осталось на каждую F№ сетхукнуть и готово! Но вот облом, в сетхуке нужно передавать указатель на функцию-фильтр (адрес подключаемой процедуры для обработки нажатия клавиши). Из поста http://codeby.net/forum/threads/33072s0.html?...mp;#entry154233 я понял, что плохи наши дела. Мол нету в лотусскрипте такой фичи как указатель на процедуру (что в vb выглядит как SetWindowsHookEx(WH_KEYBOARD, AddressOf kbdProc, hinst, 0)). Значит напрямую из ls хука не поставишь. Однако, функции для установки хуков могу написать на том же vb в dll'ке, а потом дёргать их из скрипта. Но тогда встают вот какие проблемы:

    1) допустим, я замутил хук на F2, вызвав при открытии базы соотвутствующую установке хука функцию из написанной мной dll'ки (при закрытии - анхук всего нахученного). в той же dll мне нужно будет как-то написать на vb обработчик, чтобы при нажатии в лотусе F2, там открывалась чистая форма для создания нового документа. И к этому я даже не знаю как подступиться. можно ли это реализовать и если да, то как? Как вообще можно из не совсем посторонней программы (а библиотечка запущена будет из лотусов) добраться до пользовательского воркспейса и управлять им?
    2) на функциональные клавиши у лотуса есть свои реакции (F5 - блокировка, F3 - мув по документам и пр.). как прибить их? Это видимо решается невызовом CallNextHookEx, при успешном срабатывании по делу одного из моих выставленных хуков, но это ещё предстоит проверить (если до этого вообще дойдёт).

    Вот такая вот проблемка. Если кто с хуками разбирался, буду признателен за помощь/подсказку. Может кто-нить знает альтернативу хукам? В общем, буду рад любой полезной информации.
     
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    в Нотусе надо работать по нотусёвым пр-лам...
    если нет - пишите сами, на своём любимом видоузАПИ, и инструментом разработки, юзайте нотусёвую КОМу.
    Либо стройте бабок, с жалобами начальству - ибо нех страдать ерундой, кнопкам обучились - пусть др. учатся или - идут семечками торговать/пенсию в носок тулить и жаловаться на жизнь

    небось в скайпе или одноклассниках не вспомнят свои кнопки
    это просто элементарны юзерговнизм - выжигать калёным железом
     
  3. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    КМК, проще "хукнуть" бапок. Вспоминается старый добрый досовский редактор Лексикон и его "виндуализация". Авторы анонсировали, что под винду будет возможность переключать интерфейс к привычному досовскому виду (видимо, как раз в расчёте на бапок), но так этого и не сделали — интерфейс был только один, классический виндовый.
    А если уж соберётесь, то зачем vb? Есть C API.

    Добавлено:
    +гуголплекс
     
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    а вот и главный вопрос, собственно тебя нужно направить на простые вещи - всё что тебе нужно повесить на кнопку Ф2 - так это запуск агента!!!
    а уже сам агент зная какой текущий документ/вид будет понимать, что собственно от него хотят
    и так глядим хелп в дизайнере по VB - Using OLE
    Код (LotusScript):
    Set session = CreateObject("Notes.NotesSession")
    Messagebox session.UserName
    в твоём случае нужно от базы взять агент и запустить его - всего-то делов ;)
     
  5. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Это что ж за простые вещи такие? В свойствах агента разве есть где указать комбинацию клавиш для его запуска?
     
  6. wk01

    wk01 Active Member

    Регистрация:
    8 май 2010
    Сообщения:
    31
    Симпатии:
    0
    дадада! как раз только что в хелпе "юзинг ОЛЕ" открыл!
    там же, я так понял можно и до открытого Notes.NotesUIWorkspace добраться и через сей объект компознуть документ например. Но запуск агента тут повыгоднее будет, в плане универсальности.
    что же, похоже дело сдвинулось с мёртвой точки!

    Добавлено:
    Ну да, есть конечно C API. Но ся мне были хоть как-то привычны лет 5 назад, а за последние 3 года мне лотусскрипт почти родным стал. Ну а он то как раз с vb - братья близнецы. Так что если соберусь, то реализация на нём у меня меньше времени займёт.
     
  7. wk01

    wk01 Active Member

    Регистрация:
    8 май 2010
    Сообщения:
    31
    Симпатии:
    0
    про говнизм и нотусёвые правила - согласен. а вот виндоузАПИ мне вовсе не мило, и по возможности стараюсь обходиться без него.
    А насчёт построения бабок, тут такое дело. Заказчик базы очень хочет, чтобы его бапки были довольны (если не жизнью, то хотя бы работой). И если есть вариант уважить бабушек при разумных временных затратах, то почему бы этого не сделать. Довольны пользователи - доволен заказчик. Довольный заказчик - в перспективе постоянный клиент.
    Да и конкретно про эту фичу - штука интересная и может потом ещё где-нибудь пригодиться.
     
  8. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    это и есть самое важное, нужно не людей под систему менять а систему под людей и называется это ЭРГОНОМИЧНОСТЬ ;)
    так что удачи с хуками ;)
     
  9. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Офф: эргономичность — это когда удобно среднестатистическому пользователю. А когда Васе подай одно, Пете — другое, а бапке — "плевать чего, но чтоб красиво" (Высоцкий), это уже не эргономичность, а "юзерговнизм" (lmike). Работал в одной конторе, в которой ВСЁ затачивалось под конкретного заказчика (а у заказчика — под конкретного пользователя). Когда версий было раз, два и обсчёлся ещё туда-сюда, а как выросло до десятка процесс стал неуправляем. Не знаю что сейчас с этой конторой, кажется накрылась медным тазом.
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    Офф: на почитать - рекомендовал бы книгу Аллана Купера http://www.amazedev.com/alan-kuper-psixbol...ukax-pacientov/
    там как раз про интерфейс взаимодействия, НО по какой кнопке, на клаве, чего пущать - там ни слова (что логично)
    скорее-всего бапкам будет "удобна" любая кнопка, ассоциируемая с ч-л :)

    указать им на возможности подсветки кнопок, по зажатию Alt...
     
  11. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Коллеги, в браузере следующий код работает, а в клиенте нет:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">JS Header</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    var eventKeyPress = "KeyPress";

    function initKeyPress()
    {
    if (document.addEventListener)
    {
    document.addEventListener(eventKeyPress, keypress, false);
    alert("1");
    }
    else if (document.attachEvent)
    {
    document.attachEvent("on" + eventKeyPress, keypress);
    alert("2");
    }
    else
    {
    document.onKeyPress = keypress;
    alert(document.onKeyPress);
    }
    }

    function keyval(n)
    {
    if (n == null) return 'undefined';
    var s = '' + n;
    if (n >= 32 && n < 127) s += ' (' + String.fromCharCode(n) + ')';
    while (s.length < 9) s += ' ';
    return s;
    }

    function pressmesg(w, e)
    {
    var keyInfo = w + '\r' + keyval(e.keyCode);

    if (e.ctrlKey == true) keyInfo += ' CTRL';
    if (e.altKey == true) keyInfo += ' ALT';
    if (e.shiftKey == true) keyInfo += ' SHIFT';
    if (e.metaKey == true) keyInfo += (' ' + e.metaKey);
    return keyInfo;
    }

    function keypress(e)
    {
    if (!e) e = event;
    alert(pressmesg(eventKeyPress, e));
    }
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">onLoad</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    initKeyPress();
    Менял наименование добавляемого события, но всё равно не работает... В чём может быть дело? Клиент не позволяет добавлять события?

    Добавлено: alert(document.onKeyPress); правильно выдаёт содержимое функции keypress
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    клиент не позволяет :)
    на то они и индусы - шоб JS движок реализовать кусками
     
  13. wk01

    wk01 Active Member

    Регистрация:
    8 май 2010
    Сообщения:
    31
    Симпатии:
    0
    Итак, принялся за работу. Сначала всё пошло отлично: луканулся по vb-форумам, набросал dll-ку с хуком. Сначала простой вариант, чтобы проверить, ловит нажатия или нет. Вызовы функций из dll проверяю на тестовой vb-шной программке. В общем, нажатия F2-F12 библиотекой улавливаются на отличненько. Осталось забабахать код, который будет при отлове этих нажатий делать всякие разные штуки в нотусе (например, запускать агентов). Вот тут и возникла проблема. При вызове CreateObject и GetObject библиотечка показывает мне кукиш, а точнее "ActiveX component can't create object". Смотрю в vb список возможных референсов - ничего про ibm, lotus, notes. Вспоминаю, что клиента не устанавливал на этот комп, а уже настроенного просто копировал с другого компутера. Видимо чего-то не хватает, а именно - регистрации нотуса как OLE-сервера.
    И вот возникает 3 вопроса:
    1) есть мой комп, на котором я компилю dll, и комп пользователя, на котором бапка будет жмякать по вожделенным ею F2, F3 и др. и там и там нотус должен быть установлен из дистрибутива? или достаточно мне у себя переустановить клиента, добавить в vb референсы и перекомпилять библу?
    2) если OLE-нотус должен быть зарегистрирован на обоих компах, то можно ли его регануть без установки из дистрибутива? ну может там есть какая-нибудь самая основная супер-пупер-OLE-Notes-DLL, которую можно побыстрому regsvr32'нуть из командной строки, и всё будет тип-топ? Если такое есть, но библиотека не одна, а много, не беда - батничек можно было бы сделать. Это не потому спрашиваю, что мне лень установить себе нотес по-человечески, а потому что у заказчика пользователям ставили клиента скорей всего именно копированием.
    3) если с regsvr32 облом и клиента придётся устанавливать. чтобы все настройки клиента в новом заново не перенастраивать, нужно только папку data и notes.ini в него перекинуть из нынешнего клиента? Вот это я спрашиваю, потому что лень заново заводить каннекшены, локейшены, тимстудии, воркспейс пэйджы и букмарки.
     
  14. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    795
    Симпатии:
    78
    В каталоге notes есть соотв. reg файл - notesw32.reg который и решает эти проблемы...
     
  15. wk01

    wk01 Active Member

    Регистрация:
    8 май 2010
    Сообщения:
    31
    Симпатии:
    0
    ухты! и правда, эт то самое и есть, что мне нужно. хоть я нотес себе уже и переставить успел, но на будущее буду знать. очень полезная информация. спасибо огромное! :)
     
  16. wk01

    wk01 Active Member

    Регистрация:
    8 май 2010
    Сообщения:
    31
    Симпатии:
    0
    Ну, идём далее.
    Установил нотус заново. В референсах vb появились две лотусовые штуки: Lotus Domino Object и Lotus Notes Automation Classes. Супер! Подрубил их в референсах, перекомпилял библиотеку (забиндил в ней на F2 показ мсгбокса с усернаме и названием открытой базы). Запустил лотус, открыл базу, в тестовой vb-шной программке поставил хук, надавил F2, и о чудо! всё сработало на отлично. Усложнил задачу: сделал при нажатии запуск агента, агент - композит новый документ по нужной форме в превьюшном фрейме. Опять работает! Казалось, дело за малым - кинуть dll в каталог клиента, в каком-нить экшене задекларировать функции (хук и анхук) из этой dll'ки и вызвать хук (тут разницы с моей тестовой vb-программкой ведь быть не должно - call Hook()?), понажимать кнопки и посмотреть, что будет при F2. Тут то и приключился очередной облом! Только я давлю экшен с установкой хука (ещё даже не F2), как нотус призадумывается, потом показывает мне приложенную картинку, потом и вовсе закрывается.
    Как быть? Что не так? куда пишется инфа на тему "почему упал клиент"? Там написано, мол данные собираются, но где их найти, чтоб проанализировать? в клиентском логе пусто.
    Подсобите, пожалуйста. Может у кого будут какие идеи/предложения?
     

    Вложения:

    • fuuu_.png
      fuuu_.png
      Размер файла:
      12 КБ
      Просмотров:
      164
  17. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Код Экшена приведите, и декларацюи функции
     
  18. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    а в этот папке: IBM_TECHNICAL_SUPPORT
     
  19. wk01

    wk01 Active Member

    Регистрация:
    8 май 2010
    Сообщения:
    31
    Симпатии:
    0
    вот:
    Код (LotusScript):
    Declare Function Hook Lib "hook.dll" () As Long

    Sub Click(Source As Button)
    Call Hook
    End Sub
    а это Hook из dll-ки:
    Код (LotusScript):
    Public Const WH_KEYBOARD = 2

    Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

    Public Function Hook() As Long
    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KBDProc, hinst, 0)
    Hook = hHook
    End Function
    Кстати, результат тот же, если в Function Hook вызывать вместо SetWindowsHookEx например Msgbox "вжЪ вжЪ"
    Только vb эту dll походу воспринимает. dll кривая сама по себе и это видимо из-за того, что криво написана на кривом vb.

    Добавлено:
    здорово, спасибо за наводку!

    Всем большое спасибо за внимание и советы!
    а бапкам придётся переучиваться. хотя может к этой задачке ещё вернусь и напишу dll на сях, если время останется.
     
  20. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2

    Если не сложно, скинь свою dll или подскажи как ты ее создал.. Заранее благодарю.
     
Загрузка...
Похожие Темы - Win32 Hook Lotus
  1. Andreypoint
    Ответов:
    1
    Просмотров:
    3.098
  2. sergg
    Ответов:
    11
    Просмотров:
    4.697
  3. SaV94
    Ответов:
    5
    Просмотров:
    5.152
  4. morpheus
    Ответов:
    0
    Просмотров:
    3.305

Поделиться этой страницей