Что нового

[Мышь, клавиатура] Нажатие определенных клавиш двумя кнопками

DrazzEn

Новичок
Сообщения
2
Репутация
0
Нужно что-бы после нажатия клавиши F1 "зажималась" клавиша numpad1
если нажать F1 еще раз клавиша numpad1 отпустилась и зажалась numpad2 и снова нажать F1 зажимается numpad3 и по нажатию F2 зажималась numpad2 и по нажатию F2 зажималась numpad1

пример как секвентальная коробка передач у машины правая кнопка переключает передачи вверх а левая в низ

что-то такое нужно реализовать если можно дайте ссылки на описание функций которые мне могут понадобится и если можно какойто пример
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Пример.
Код:
HotKeySet("{F1}", "Up")
HotKeySet("{F2}", "Down")
HotKeySet("{ESC}", "Quit")

Global $i = -1

Do
  If $i <> -1 Then Send("{NUMPAD" & $i & " down}")
  Sleep(10)
Until 0

Func Up()
  $i += 1
  If $i > 9 Then $i = 9
EndFunc

Func Down()
  $i -= 1
  If $i < 0 Then $i = 0
EndFunc

Func Quit()
  Exit
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
А зачем нажимать в цикле, это лишние вызовы клавиши, Send нужно поместить в функции, а ещё лучше в одну:

Код:
HotKeySet("{F1}", "UpDown")
HotKeySet("{F2}", "UpDown")
HotKeySet("{ESC}", "Quit")

Global $i = -1

While 1
    Sleep(100)
WEnd

Func UpDown()
    Switch @HotKeyPressed
        Case '{F1}' ;Up
            $i += 1
            If $i > 9 Then $i = 9
        Case '{F2}' ;Down
            $i -= 1
            If $i < 0 Then $i = 0
    EndSwitch
    
    Send("{NUMPAD" & $i & " Down}")
EndFunc

Func Quit()
  Exit
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
В заявке указано "зажималась". А в вашем коде происходит однократное нажатие.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
в вашем коде происходит однократное нажатие
Ну так {Key Down} зажмёт клавишу, читайте справку.

Странно, в справке не указано что оно работает не для всех клавиш...
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Я читал справку. Но у меня на версии 3.3.8.0 этого не происходит. Поэтому я и перенёс нажатие в цикл.
(Кстати, у заказчика вообще версия 2.28 :blink: )


Добавлено:
Сообщение автоматически объединено:

Я пробовал пример из справки
Код:
Send("{a down}")

Но он у меня тоже не работает.
Подскажите, для каких клавиш это работает?
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
А как вы проверяете на работоспособность?
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Send("{a down}") такое сочетание работает в играх, там зажимается кнопка.
 
Автор
D

DrazzEn

Новичок
Сообщения
2
Репутация
0
извините я не ту версию записал у меня 3.3.8.1
About SciTE Lite посмотрел версию там было 2.28
Работает просто отлично но не зажимаются клавиши :'(

я так понимаю никак не реализовать зажатие?
Вроде C++ учил давненько но все забыл)
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
HotKeySet("{F1}", "UpDown")
HotKeySet("{F2}", "UpDown")
HotKeySet("{ESC}", "Quit")

Global $i = -1

While 1
    Sleep(100)
WEnd

Func UpDown()
    Switch @HotKeyPressed
        Case '{F1}' ;Up
            $i += 1
            If $i > 9 Then $i = 9
        Case '{F2}' ;Down
            $i -= 1
            If $i < 0 Then $i = 0
		EndSwitch

    While 1
    Send('{NUMPAD'&$i&'}')
	WEnd

EndFunc

Func Quit()
  Exit
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
sngr
Забавно, это же что получается, что Hotkey функция завершает приостанавливает все остальные циклы Hotkey функции?
Судя из этого, подобный пример не очень дружелюбный к памяти процесса ;)
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Я так понимаю, что нажав клавишу, мы запускаем Func UpDown(), в коей цикл без выхода. Нажав клавишу ешё раз мы приостанавливаем 1 функцию, запускаем вторую - отсюда память. Так вроде получше.
Код:
HotKeySet("{F1}", "UpDown")
HotKeySet("{F2}", "UpDown")
HotKeySet("{ESC}", "Quit")

Global $i = -1
Global $quit=True
While 1
    Sleep(100)
WEnd

Func UpDown()
	$quit=Not $quit
	If $quit Then Return
    Switch @HotKeyPressed
        Case '{F1}' ;Up
            $i += 1
            If $i > 9 Then $i = 9
        Case '{F2}' ;Down
            $i -= 1
            If $i < 0 Then $i = 0
		EndSwitch
    Do
    Send('{NUMPAD'&$i&'}')
	Until $quit
EndFunc

Func Quit()
  Exit
EndFunc



Добавлено:
Сообщение автоматически объединено:

Необязательно Hotkey функция - можно вызывать функцию через тыканье в меню иконки.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Провёл некоторые изыскания. Сравнил работу
Код:
Send("{w down}")

в текстовом редакторе и в игре. В игре кнопка зажимается, в редакторе - нет.
Далее сравнил отправку в цикле
Код:
Send("w")

Работает и в редакторе и в игре. Но в игре движение происходит рывками, т.е. не применимо.
А вот отправка в цикле
Код:
Send("{w down}")

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
Работает и в редакторе и в игре. Но в игре движение происходит рывками, т.е. не применимо
Для этого есть опции:
Код:
Opt('SendKeyDelay')
Opt('SendKeyDownDelay')
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Про опции знаю.
Код:
Opt('SendKeyDelay')

в данном случае рывки не устаняет, а даже наоборот.
А вот опция
Код:
Opt('SendKeyDownDelay')

действительно может сгладить движение при вызове нажатий клавиши в цикле. У меня рывки прекратились при значениях 250 и выше. Но в это время другие хоткеи не работают. Т.е. при значении, например, 3000, хоткеи будут отрабатывать только по истечении этого времени. Что долго.
Мой личный вывод: способов решения много, нюансов тоже. Каждый конкретный случай нужно рассматривать отдельно.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
А ниже - рывки заметны. Т.е. движение происходит не плавно, а как бы прыжками.

Наверно, неправильно выразился...
При значениях 250 и выше рывки, возможно, и не прекратились, но их стало незаметно.
 
Верх