Win32 Hook и Lotus Notes

  • Автор темы wk01
  • Дата начала
W

wk01

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

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

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

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
в Нотусе надо работать по нотусёвым пр-лам...
если нет - пишите сами, на своём любимом видоузАПИ, и инструментом разработки, юзайте нотусёвую КОМу.
Либо стройте бабок, с жалобами начальству - ибо нех страдать ерундой, кнопкам обучились - пусть др. учатся или - идут семечками торговать/пенсию в носок тулить и жаловаться на жизнь

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

nvyush

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

Добавлено:
это просто элементарны юзерговнизм - выжигать калёным железом
+гуголплекс
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
вообще можно из не совсем посторонней программы (а библиотечка запущена будет из лотусов) добраться до пользовательского воркспейса и управлять им?
а вот и главный вопрос, собственно тебя нужно направить на простые вещи - всё что тебе нужно повесить на кнопку Ф2 - так это запуск агента!!!
а уже сам агент зная какой текущий документ/вид будет понимать, что собственно от него хотят
и так глядим хелп в дизайнере по VB - Using OLE
Код:
Set session = CreateObject("Notes.NotesSession")
Messagebox session.UserName

в твоём случае нужно от базы взять агент и запустить его - всего-то делов ;)
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
тебя нужно направить на простые вещи - всё что тебе нужно повесить на кнопку Ф2 - так это запуск агента!!!
Это что ж за простые вещи такие? В свойствах агента разве есть где указать комбинацию клавиш для его запуска?
 
W

wk01

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

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

wk01

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

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

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
А насчёт построения бабок, тут такое дело. Заказчик базы очень хочет
это и есть самое важное, нужно не людей под систему менять а систему под людей и называется это ЭРГОНОМИЧНОСТЬ ;)
так что удачи с хуками ;)
 
N

nvyush

это и есть самое важное, нужно не людей под систему менять а систему под людей и называется это ЭРГОНОМИЧНОСТЬ wink.gif
Офф: эргономичность — это когда удобно среднестатистическому пользователю. А когда Васе подай одно, Пете — другое, а бапке — "плевать чего, но чтоб красиво" (Высоцкий), это уже не эргономичность, а "юзерговнизм" (lmike). Работал в одной конторе, в которой ВСЁ затачивалось под конкретного заказчика (а у заказчика — под конкретного пользователя). Когда версий было раз, два и обсчёлся ещё туда-сюда, а как выросло до десятка процесс стал неуправляем. Не знаю что сейчас с этой конторой, кажется накрылась медным тазом.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Офф: на почитать - рекомендовал бы книгу Аллана Купера
там как раз про интерфейс взаимодействия, НО по какой кнопке, на клаве, чего пущать - там ни слова (что логично)
скорее-всего бапкам будет "удобна" любая кнопка, ассоциируемая с ч-л :)

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

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Коллеги, в браузере следующий код работает, а в клиенте нет:
<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">
Код:
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">
Код:
initKeyPress();
Менял наименование добавляемого события, но всё равно не работает... В чём может быть дело? Клиент не позволяет добавлять события?

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
клиент не позволяет :)
на то они и индусы - шоб JS движок реализовать кусками
 
W

wk01

Итак, принялся за работу. Сначала всё пошло отлично: луканулся по 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 в него перекинуть из нынешнего клиента? Вот это я спрашиваю, потому что лень заново заводить каннекшены, локейшены, тимстудии, воркспейс пэйджы и букмарки.
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
47
1) есть мой комп, на котором я компилю dll, и комп пользователя, на котором бапка будет жмякать по вожделенным ею F2, F3 и др. и там и там нотус должен быть установлен из дистрибутива? или достаточно мне у себя переустановить клиента, добавить в vb референсы и перекомпилять библу?
2) если OLE-нотус должен быть зарегистрирован на обоих компах, то можно ли его регануть без установки из дистрибутива? ну может там есть какая-нибудь самая основная супер-пупер-OLE-Notes-

В каталоге notes есть соотв. reg файл - notesw32.reg который и решает эти проблемы...
 
W

wk01

В каталоге notes есть соотв. reg файл - notesw32.reg который и решает эти проблемы...

ухты! и правда, эт то самое и есть, что мне нужно. хоть я нотес себе уже и переставить успел, но на будущее буду знать. очень полезная информация. спасибо огромное! :)
 
W

wk01

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

Вложения

  • fuuu_.png
    fuuu_.png
    6 КБ · Просмотры: 679
M

morpheus

Код Экшена приведите, и декларацюи функции
 
H

hosm

Как быть? Что не так? куда пишется инфа на тему "почему упал клиент"? Там написано, мол данные собираются, но где их найти, чтоб проанализировать? в клиентском логе пусто.
а в этот папке: IBM_TECHNICAL_SUPPORT
 
W

wk01

Код Экшена приведите, и декларацюи функции
вот:
Код:
Declare Function Hook Lib "hook.dll" () As Long

Sub Click(Source As Button)
Call Hook
End Sub
а это Hook из dll-ки:
Код:
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.

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

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

proteam

вот:
Код:
Declare Function Hook Lib "hook.dll" () As Long

Sub Click(Source As Button)
Call Hook
End Sub
а это Hook из dll-ки:
Код:
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 на сях, если время останется.


Если не сложно, скинь свою dll или подскажи как ты ее создал.. Заранее благодарю.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!