|
|
|
Определение нажатия клавиши |
|
|
dron4938 |
28.5.2017, 21:19
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Определяет какая клавиша нажата Определяет за 15мс Как использовать: 1. Качаем архив, перезалито https://yadi.sk/d/j5YV5rNM3JduXS2. Папку из архива KeyBoard и программу keyboardtestutility.exeкидаем в вашу папку пилота 3. Запускаем программу keyboardtestutility.exe 4. Готово. Далее пользуемся скриптом. (скрипт спрячет эту программу за пределы экрана и будет с ней работать) Список доступных клавиш: 1 2 3 4 5 6 7 8 9 0 minus plus F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 Q W E R T Y U I O P A S D F G H J KL Z X C V B N M left right up down Backspace Insert Delete Home End PageUp PageDown Enter RightCtrl LeftAlt RightAlt LeftShift RightShift Space Tab Добавляйте в скрипт, только те клавиши, которые нужныДобавлено немного звуков:alarm KeyBoard\din.wav alarm KeyBoard\exit.wav alarm KeyBoard\pause.wav alarm KeyBoard\play.wav alarm KeyBoard\plip.wav alarm KeyBoard\trak.wavСам скрипт
Код set %stroka [1 1] homepath // адрес папки с пилотом set #handleKeyboard FindWindow ("Keyboard Test Utility") // ищем окно Keyboard set workwindow #handleKeyboard showwindow #handleKeyboard RESTORE init_arr %button (1) q w e 1 2 3 4 5 6 7 F2 F3 F4 F5 Insert Home Tab minus plus LeftAlt // список клавиш set windowpos -900 0 800 330 //изменяем размеры окна программы и прячем ее за пределы экрана if #handleKeyboard = 0 hint (24 clRed 400, 400 (Keyboard Test Utility - НЕ НАЙДЕНО)) alarm KeyBoard\exit.wav end_script end_if // поиск хендлов кнопки reset и about set #tmp getwindow (#handleKeyboard child) set #tmp getwindow (#tmp child) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #hana8 getwindow (#tmp next) // reset set #hana9 getwindow (#hana8 next) // about
left 30 10 #hana8 left 10, 2 #hana9 wait 10 set #handleKeyboard2 FindWindow ("About Keyboard Test Utility") // ищем окно Keyboard2 set workwindow #handleKeyboard2 set windowpos -900 0 80 32 ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// :MAIN /// Ваш скрипт, пример set $button null while $button != f2 // пока не нажата клавиша f2 gosub KeyboardSet // строка вызова скрипта wait 100 end_while log Натажа клавиша $button log Какие-то действия alarm KeyBoard\trak.wav goto MAIN ////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////// В конец скрипта :KeyboardSet set timer set %get getImage (110 285 150 300 #handleKeyboard) for #i 1 size(%button[]) set #a FindImage (0 0 30 20 (%stroka [1 1]KeyBoard\%button [1 #i].bmp) %arr %get[1 1] 100 1) if #a > 0 Hint Нажата кнопка: %button [1 #i] (timer мс) wait 50 + random (30) sendex {f12} set $button %button [1 #i] if $button = f4 // Если нажата f4, то закроется Keyboard Test terminate "Keyboard Test Utility" Hint Клава закрыта alarm KeyBoard\plip.wav end_if break end_if end_for set $del deleteimage(%get [1 1]) return
(IMG: https://i.yapx.ru/Jec6.jpg) ******************************************Способ №21.Качаем длл плагин https://yadi.sk/d/dD6YzMvv3Jduhe2.Закидываем dll-ку в папку Plugins рядом с пилотом 3.Используем скрипт А или B Скрипт А -упрощенный (доступен поиск 0-9 и всех букв)
Код gosub Keyboard // вызов скрипта //////////////////////////////////////// В конец скрипта :Keyboard init_arr %button (1) 1 2 3 4 5 6 7 8 9 0 Q W E R T Y U I O P A S D F G H J K L Z X C V B N M // список клавиш set timer for #i 1 size(%button[]) set $a KB.GetKeyState(%button [1 #i]) set $button %button [1 #i] if $a > 0 Hint Нажата кнопка: %button [1 #i], (timer мс) end_if end_for return
Скрипт B (доступен поиск всех кнопок по скан-коду)
Код gosub Keyboard // вызов скрипта //////////////////////////////////////// В конец скрипта :Keyboard init_arr %button (1) 49 50 51 52 53 54 55 56 57 48 112 113 114 115 116 117 118 119 120 121 122 123 81 87 69 82 84 89 85 73 79 80 65 83 68 70 71 72 74 75 76 90 88 67 86 66 78 77 9 20 160 162 164 32 13 8 45 46 36 35 33 34 37 39 38 40 27 // список клавиш set timer for #i 1 size(%button[]) set $a KB.GetKeyStateByCode(%button [1 #i]) set $button %button [1 #i] if $a > 0 Hint Нажата кнопка: %button [1 #i], (timer мс) end_if end_for
Коды кнопок)
Код //////////Коды кнопок //1-49/2-50/3-51/4-52/5-53/6-54/7-55/8-56/9-57/0-48 //F1-112/F2-113/F3-114/F4-115/F5-116/F6-117/F7-118/F8-119/F9-120/F10-121/F11-122/F12-123 //Q-81/W-87/E-69/R-82/T-84/Y-89/U-85/I-73/O-79/P-80/A-65/S-83/D-68/F-70/G-71/H-72/J-74 //K-75/L-76/Z-90/X-88/C-67/V-86/B-66/N-78/M-77/ //TAB-9/CAPS LOCK-20/SHIFT-160/CTRL-162/ALT-164/SPACE-32/ENTER-13/BACKSPACE-8/INSERT-45 //DELETE-46/HOME-36/END-35/PAGEUP-33/PAGEDOWN-34/LEFT-37/RIGHT-39/UP-38/DOWN-40/ESC-27
|
|
|
|
cirus |
28.5.2017, 23:05
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26702
Пользователь №: 16.971
Возраст: 29
|
Тоже самое, только короче. Проверяет все клавиши 0 - 9, f1 - f12. код
Код ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////// В начало скрипта set %stroka [1 1] homepath // адрес папки с пилотом set #handleKeyboard FindWindow ("Keyboard Test Utility") // ищем окно Keyboard set workwindow #handleKeyboard showwindow #handleKeyboard RESTORE init_arr %button (1) 1 2 3 4 5 6 7 8 9 0 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 // список клавиш set windowpos -900 600 800 330 //изменяем размеры окна программы и прячем ее за пределы экрана
if #handleKeyboard = 0 hint (24 clRed 400, 400 (Keyboard Test Utility - НЕ НАЙДЕНО)) end_script end_if // поиск хендла кнопки reset set #tmp getwindow (#handleKeyboard child) set #tmp getwindow (#tmp child) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #hana8 getwindow (#tmp next)
////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////
gosub KeyboardSet // строка вызова скрипта
////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////// В конец скрипта :KeyboardSet set timer ///////// Далее убрать слеши перед строкой, для нужной клавиши (если 3 клавиши то определение нажатия составит ~15мс) set %get getImage (40, 5 521, 115 #handleKeyboard) for #i 1 size(%button[]) set #a FindImage (0 0 471 110 (%stroka [1 1]KeyBoard\%button [1 #i].bmp) %arr %get[1 1] 100 1) if #a > 0 Hint Нажата кнопка: %button [1 #i], timer left 30 10 #hana8 break end_if end_for set $del deleteimage(%get [1 1]) return На win10 работает только если Keyboard Test Utility запущена от админа. При этом перехватывает нажатие клавиши. Т. е. определить что клавиша нажата можно, а вот нажатие в приложение не проходит. Картинку f1 надо переделать, т. к. при нажатии f10-f12, находится картинка f1. P.S. Кнайт, сделай нормальную функцию.
|
|
|
|
dron4938 |
28.5.2017, 23:28
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
да, такая же ботва, после того как определяет нажатую кнопку, клавиатура в приложении не работает. Все из-за команды left 30, 10 #hana8.
Если окно виртуальной клавиатуры полностью не прятать, а оставить кнопку reset на виду и при этом использовать kleft 30, 10 #hana8 , тогда работает, но как то неудобно когда кусок программы торчит.
Поищу, что-то другое пожалуй
|
|
|
|
dron4938 |
29.5.2017, 0:33
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
На win10 работает только если Keyboard Test Utility запущена от админа. При этом перехватывает нажатие клавиши. Т. е. определить что клавиша нажата можно, а вот нажатие в приложение не проходит. Картинку f1 надо переделать, т. к. при нажатии f10-f12, находится картинка f1. спасяб за упрощенный код, и чутка переделал добавив после поиска хендла кнопки- 1 действие, теперь работает в приложениях. код
Код ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////// В начало скрипта set %stroka [1 1] homepath // адрес папки с пилотом set #handleKeyboard FindWindow ("Keyboard Test Utility") // ищем окно Keyboard set workwindow #handleKeyboard showwindow #handleKeyboard RESTORE init_arr %button (1) 1 2 3 4 5 6 7 8 9 0 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 // список клавиш set windowpos 0 -900 800 330 //изменяем размеры окна программы и прячем ее за пределы экрана
if #handleKeyboard = 0 hint (24 clRed 400, 400 (Keyboard Test Utility - НЕ НАЙДЕНО)) end_script end_if // поиск хендла кнопки reset set #tmp getwindow (#handleKeyboard child) set #tmp getwindow (#tmp child) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #hana8 getwindow (#tmp next) set #hana9 getwindow (#hana8 next)
left 10, 2 #hana9 wait 10 set %handle2 FindWindow ("About Keyboard Test Utility") // ищем окно Keyboard2 set #handleKeyboard2 %handle2 [1 1] set workwindow #handleKeyboard2 set windowpos 0 -900 80 32 ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// :MAIN /// Ваш скрипт gosub KeyboardSet // строка вызова скрипта
////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////// В конец скрипта :KeyboardSet set timer ///////// Далее убрать слеши перед строкой, для нужной клавиши (если 3 клавиши то определение нажатия составит ~15мс) set %get getImage (40, 5 521, 115 #handleKeyboard) for #i 1 size(%button[]) set #a FindImage (0 0 471 110 (%stroka [1 1]KeyBoard\%button [1 #i].bmp) %arr %get[1 1] 100 1) if #a > 0 Hint Нажата кнопка: %button [1 #i], timer left 30 10 #hana8 break end_if end_for set $del deleteimage(%get [1 1]) return goto MAIN
единственное, теперь виртуальная клава закрывается только через контр+альт+делет) зато работает (IMG: style_emoticons/default/smile.gif) а как теперь условие задавать? если нажата F2 например, то действия (IMG: style_emoticons/default/rolleyes.gif)
|
|
|
|
dron4938 |
29.5.2017, 13:11
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
а в чем может быть косяк, иногда срабатывает по 2 раза? задержку гдет сувать? Или у меня клавиатура каличная, иногда по 2 раза жмакает Вроде как иногда нажатие по ресет не проходило Код Hint Нажата кнопка: %button [1 #i], timer left 30 10 #hana8 изменил на Код Hint Нажата кнопка: %button [1 #i], timer set MouseClickDelay 30 double_left 30 10 #hana8
|
|
|
|
dron4938 |
29.5.2017, 18:14
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Цитата(Cockney @ 29.5.2017, 18:24) Названия ни о чем не говорят ? Код set $q KB.GetKeyStateByCode(81) //узнать статус клавиши, на которой написана Q(или руск. Й) по коду
set $q KB.GetKeyState(Q) //узнать что с клавишей Q Спасяб за длл ку) Код init_arr %button (1) 1 2 3 4 5 6 7 8 9 0 Q W E R T Y U I O P A S D F G H J K L Z X C V B N M // список клавиш set timer for #i 1 size(%button[]) set $a KB.GetKeyState(%button [1 #i]) set $button %button [1 #i] if $a > 0 Hint Нажата кнопка: %button [1 #i], (timer мс) end_if end_for Код init_arr %button (1) 49 50 51 52 53 54 55 56 57 48 112 113 114 115 116 117 118 119 120 121 122 123 81 87 69 82 84 89 85 73 79 80 65 83 68 70 71 72 74 75 76 90 88 67 86 66 78 77 9 20 160 162 164 32 13 8 45 46 36 35 33 34 37 39 38 40 27 // список клавиш set timer for #i 1 size(%button[]) set $a KB.GetKeyStateByCode(%button [1 #i]) set $button %button [1 #i] if $a > 0 Hint Нажата кнопка: %button [1 #i], (timer мс) end_if end_for //////////Коды клавиш //1-49/2-50/3-51/4-52/5-53/6-54/7-55/8-56/9-57/0-48 //F1-112/F2-113/F3-114/F4-115/F5-116/F6-117/F7-118/F8-119/F9-120/F10-121/F11-122/F12-123 //Q-81/W-87/E-69/R-82/T-84/Y-89/U-85/I-73/O-79/P-80/A-65/S-83/D-68/F-70/G-71/H-72/J-74 //K-75/L-76/Z-90/X-88/C-67/V-86/B-66/N-78/M-77/ //TAB-9/CAPS LOCK-20/SHIFT-160/CTRL-162/ALT-164/SPACE-32/ENTER-13/BACKSPACE-8/INSERT-45 //DELETE-46/HOME-36/END-35/PAGEUP-33/PAGEDOWN-34/LEFT-37/RIGHT-39/UP-38/DOWN-40/ESC-27 только после подключения дллки к пилоту антивирус кричит про троян, и хочет вылечить пилота с помощью перезагрузки компа. P.S после перезагрузки, антивир удалил exe пилота и выдал: (IMG: https://i.yapx.ru/JiIB.jpg)
|
|
|
|
cirus |
30.5.2017, 2:28
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26702
Пользователь №: 16.971
Возраст: 29
|
Цитата Решение многолетней проблемы. Наконец-то. Спасибо. Цитата set $a KB.GetKeyState(%button [1 #i]) set $button %button [1 #i] if $a > 0 Можно так: Код if KB.GetKeyState(%button [1 #i]) = 1 Проверка цифр 0-9 и букв A-Z: Код for #i 48 90 if KB.GetKeyStateByCode(#i) = 1 Hint Нажата кнопка: chr(#i) end_if end_for wait 10 P. S. Добавьте в раздел плагины. Чтоб не потерялось.
|
|
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|