On-line: Andrey, PSP, гостей 1. Всего: 3 [подробнее..]
АвторСообщение





Пост N: 125
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 16.08.13 19:43. Заголовок: SOLVED!!! -> TRAPANYKEY() и KEYSEND() или запись/воспроизведение клавиатурных макросов


Практически со всем разобрался и восстановил функционал.

Осталось одно и достаточно важное дело: автоматизация рутинных операций. В Clipper это происходило при помощи функций TRAPANYKEY/KEYSEND

Первая при нажатии на любую клавишу в любом месте программы (включая GET/DBEDIT/ACHOICE/INKEY и тп) вызывает указанную мною функцию и передает ей код нажатой кнопки.
Пользовательская функция тихо сидит и собирает эти коды в буфер - "записывает" нажатия клавиш юзером.

В случае, если нужно "воспроизвести" записанные нажатия на кнопки, вызывается KEYSEND() с этим буфером в качестве параметра.

Просто и логично.

---------------------------------

Встал вопрос - чем и как заменить этот функционал? Без него меня разорвут на части - делать множество рутинных операций без клавиатурных макросов чокнешься...

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 45 , стр: 1 2 3 All [только новые]







Пост N: 134
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 17.08.13 10:17. Заголовок: SergKis, это возможн..


SergKis, это возможно то что нужно - буду изучать.

Вот что еще нарыл ночью: http://www.freevbcode.com/ShowCode.asp?ID=4042

Private Function KeyDown(ByVal vKey As KeyCodeConstants) _ 
As Boolean
KeyDown = GetAsyncKeyState(vKey) And &H8000
End Function

'DEMO USAGE
Private Sub Timer1_Timer()
If KeyDown(vbKeyF10) Then MsgBox "You pressed F10!" 'This msgbox will appear regardless of the active app.
End Sub


Как понимаю - по таймеру вызывается GetAsyncKeyState и проверяется - если нажата F10 - выводится окно. У наст такое-же можно сделать через LastKey().
Но посмотрю подобные API функции - наверняка можно будет что-то найти "рядом", подходящее по условию.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3404
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.08.13 18:16. Заголовок: Sergy пишет: Вот чт..


Sergy пишет:

 цитата:
Вот что еще нарыл ночью


Тогда до кучи https://groups.google.com/forum/#!topic/comp.lang.xharbour/e77vVVb1Kuc

Спасибо: 1 
ПрофильЦитата Ответить
администратор




Пост N: 3411
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.08.13 11:09. Заголовок: Sergy Вопрос решил ..


Sergy
Вопрос решил ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 167
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 21.08.13 12:05. Заголовок: Dima пишет: Вопрос ..


Dima пишет:

 цитата:
Вопрос решил ?


к сожалению, нет, но очень нужно.

Пока из идей - в фоне сидит функция, которая мониторит клавиатуру по LastKey(). Если установлен флаг "запись" - складывает в буффер.

Только как отличить два подряд нажатия одной клавиши... ???


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 233
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.08.13 17:45. Заголовок: Sergy пишет:к сожале..


Sergy пишет:
 цитата:
к сожалению, нет, но очень нужно


посмотрите в harbour\doc\en\set.txt и harbour\test\setkeys.prg
используя aKey := hb_SetKeySave() // сохранить рабочие
hb_SetKeyArray( { 49, 50, 52, 53 }, {| x | QOut( hb_keyChar( x ) ) } ) //блок кода на все клавиши поставить для записи и работы
вполне можно организовать запись всех нажатий
hb_SetKeySave(aKey) // восстановить рабочие


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 234
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.08.13 17:50. Заголовок: Sergy пишет:Только к..


Sergy пишет:
 цитата:
Только как отличить два подряд нажатия одной клавиши... ???


есть LastKey() и NextKey(), а также Ваш буфер куда складываете ...

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 219
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 24.08.13 18:15. Заголовок: SergKis пишет: посм..


SergKis пишет:

 цитата:
посмотрите в harbour\doc\en\set.txt и harbour\test\setkeys.prg
используя aKey := hb_SetKeySave() // сохранить рабочие
hb_SetKeyArray( { 49, 50, 52, 53 }, {| x | QOut( hb_keyChar( x ) ) } ) //блок кода на все клавиши поставить для записи и работы
вполне можно организовать запись всех нажатий
hb_SetKeySave(aKey) // восстановить рабочие



Честно говоря, не очень понял метода...
Как понимаю, hb_SetKeyArray() предназначена для "оптового" назначения блоков кода клавишам.
а hb_SetKeySave() - для быстрого снятия/установки блоков кода группе клавиш.

Если поставить блок кода на клавишу - он сможет ее перехватить. Но как эта кнопка доберется туда, куда она была предназначена ? В get поле, memoedit() и тп...


 цитата:
есть LastKey() и NextKey(), а также Ваш буфер куда складываете ...


При помощи LastKey() и планировал отслеживать нажатия.
Вот вызвана функция "записи" по таймеру, скажем, каждые 0,2 сек.

Она видит через LastKey() что нажата кнопка F1, складывает в буфер, возвращает управление назад.
Следующий вызов через 0,2 сек - LastKey() опять показывает K_F1 - как понять, это предыдущее нажатие или юзер еще раз успел за это время нажать ?
В хвосте буфера мы видим, что уже есть F1.

NextKey() покажет что-нибудь только если в буфере клавиатуры есть необработанные кнопки. Как она сможет помочь, если юзер, допустим, нажал два раза F1 с интервалом в 2 секунды ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 236
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.08.13 20:32. Заголовок: Sergy конечно, я не ..


Sergy
конечно, я не очень понимаю как работает задача и юзера. но включив запись, я понимаю должно писаться ВСЕ, что нажимается иначе это уже алгоритмизация процесса (If ... else ... endif), а второй раз нажатая right(buffer, 1) == chr(Lastkey()). а определить где находитесь procname(1/2/...) или для get-ов делаем arraykey свой, для memoedit свой, ну т.д.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3462
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.08.13 21:48. Заголовок: Sergy Покажи нам ес..


Sergy
Покажи нам если не секрет процедуру записи макроса и его воспроизведения с комментариями ,
возможно тогда у кого то мысли появятся.
PS
О Clipper грю

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 222
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 24.08.13 21:53. Заголовок: В начале программы: ..


Dima пишет:

 цитата:
если не секрет






В начале программы:

SETKEY(K_CTRL_F10,{|x,y,z|DefMacro(x,y,z,"Ctrl+F10",17408)})
SETKEY(K_F10 ,{||PlayMacro()})

Далее:

Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 237
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.08.13 09:12. Заголовок: Sergy может в таком ..


Sergy
может в таком направлении:
 
STATIC cBuf := ''
...
SetKey(-29, {|| MyTest() })
SetKey(254, {|| MyTest(.T.) })
cTest := 'aaaabbbbb '
nTest := 1234567.89
@ 2, 10 GET cTest
@ 3, 10 GET nTest
READ
...
FUNC myTest( lReg )
LOCAL nKey
IF empty(lReg) // start records
cBuf := ''
KEYBOARD chr(254)
ELSE // records
DO WHILE ( nKey := inkey(0) ) != -9
cBuf += chr(nKey)
IF nKey > 31
KEYBOARD chr(nKey)+chr(254)
RETURN
ENDIF
ENDDO
ENDIF
RETURN


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 223
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 25.08.13 11:43. Заголовок: идея - ОФИГИТЕЛЬНАЯ ..


идея - ОФИГИТЕЛЬНАЯ и все работает.
Ровно до тех пор, пока не возникнет потребность в спец. клавишах F1..F10, стрелки и тп...

SergKis пишет:
 цитата:
IF nKey > 31



Вот блин засада... если я правильно понимаю, Clipper с легкостью засовывал в буфер клавиатуры все спец. символы, включая K_CTRL_F4 и прочие...

Пока разбираюсь с HB_KeyPut()...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 238
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.08.13 12:41. Заголовок: Sergy пишет:Вот блин..


Sergy пишет:
 цитата:
Вот блин засада...


это код с S87, его конечно надо перевести на aBuf, aadd(aBuf, nKey) и hb_keyput ..., к своей ситуации

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 224
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 25.08.13 18:13. Заголовок: Короче бился и так и..


Короче бился и так и эдак, получилось вот что:

Скрытый текст


Вроде заработало. Но не могу подружить с DBEDIT() - не работает вообще никак. Ничего не записывается. А он очень нужен...

Любая команда наподобие CLEAR TYPEAHEAD, KEYBOARD ломает алгоритм полностью.
У себя в коде вычистил. Возможно что-то внутри RTL осталось...

Вот что нашел в ChangeLog.txt:


 цитата:
2012-11-23 17:14 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) 
* harbour/contrib/xhb/xhbtedit.prg
* harbour/contrib/hbmysql/tsqlbrw.prg
* harbour/contrib/hbodbc/browodbc.prg
% eliminated NextKey() calls
; TOFIX: BrowseODBC() just like dbEdit() ignore setKey() actions
If key is pressed during stabilization faze.
I think it's
implementation problem not intentional decision and it
should be fixed - there is nothing worse then application
which ignores some keystrokes if user types to fast ;)
I'd like to ask authors of above code to check it.




Причем заметил, что если комбинацию записать в другом месте программы, а потом воспроизвести ее в DBEDIT - все работает.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2954
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 25.08.13 20:19. Заголовок: Извините, я не следи..


Извините, я не следил за обсуждением, у самого есть некоторые вопросы.
Идея записи и воспроизведения клавиатурных макросов сама по себе неплохая. Реализовать ее можно следующим образом:

Запись кодов клавиш:

#include "hbgtinfo.ch"

Static aKeys := {} // массив клавиш

hb_gtInfo(HB_GTI_INKEYFILTER, {|nk| KeyRec(nk)})

Static func KeyRec(nk)
AADD(aKeys, nk)
Return nk

Остановить запись:

hb_gtInfo(HB_GTI_INKEYFILTER, nil)


Воспроизвести можно той же функцией hb_KeyPut, которая в качестве параметра принимает и массив:

hb_KeyPut(aKeys)


Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 226
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 25.08.13 21:30. Заголовок: Pasha пишет: hb_gtI..


Pasha пишет:

 цитата:
hb_gtInfo(HB_GTI_INKEYFILTER, {|nk| KeyRec(nk)})



Методо работает ОТЛИЧНО. Во всех возможных режимах прогнал.

Все воскресенье прошло впустую...

Спасибо!!!
Harbour - сила.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1
Зарегистрирован: 24.09.13
ссылка на сообщение  Отправлено: 24.09.13 20:36. Заголовок: Как тут уже пробегал..


Как тут уже пробегало, с помощью hb_gtInfo( HB_GTI_INKEYFILTER, ...) можно подменить код клавиши, например
 
hb_gtInfo( HB_GTI_INKEYFILTER, { | nKey |
SWITCH nKey
CASE HB_K_F10
RETURN K_ESC
ENDSWITCH
RETURN nKey
} )


а как бы сделать еще один "финт ушами" и вставить еще несколько "нажатий"?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 304
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 24.09.13 23:08. Заголовок: Marquis31 пишет: а ..


Marquis31 пишет:

 цитата:
а как бы сделать еще один "финт ушами" и вставить еще несколько "нажатий"?



KEYSEND() - вставляет сколько душе угодно.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2
Зарегистрирован: 24.09.13
ссылка на сообщение  Отправлено: 25.09.13 08:04. Заголовок: Сейчас проверю, но е..


Сейчас проверю, но есть у меня подозрение, что это "нажатие" вернется в тот же обработчик, заданный в hb_gtInfo(...



Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 306
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 25.09.13 12:44. Заголовок: Конечно вернется - м..


Конечно вернется - можно даже не проверять. Иначе этот обработчик не работал-бы...

Только ведь в нем не все кнопки должны быть заменены, а только те, что нужны.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 45 , стр: 1 2 3 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 58
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет