1 (изменено: SHOX, 2021-05-15 22:47:00)

Тема: AHK: Залипание при недолгом нажатии клавиши.

Здравствуйте. Подскажите пожалуйста возможно ли реализовать скрит который бы определял что зажата клавиша и через секунды 2 происходило залипание этой же клавиши. Такая есть функция в Windows но она к моему сожалению только на левую кнопку мыши работает.

Post's attachments

Безымянный.png 41.97 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Залипание при недолгом нажатии клавиши.

SHOX, добавьте, пожалуйста, в заголовок префикс языка, как сделано в других темах.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Залипание при недолгом нажатии клавиши.

Распишите пример, иначе непонятно что нужно в итоге.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK: Залипание при недолгом нажатии клавиши.

__Михаил__ Если нажимать клавишу то она просто работает обычно. Но если  эту же клавишу зажать к примеру больше двух секунд и отпустить то она залипает до тех пор пока не нажать на нее повторно.

5

Re: AHK: Залипание при недолгом нажатии клавиши.

Удалось так, но возможно есть иной способ:

HotKey, $vk1, Lag, On
HotKey, $vk2, Lag, On
Return

Lag:
Key := SubStr(A_ThisHotkey, 2,99)	; Извлечь клавишу, которая запустила метку.	
ToolTip, Ждём отпуск: %Key%,0,0
Time := A_TickCount
SendInput, {%Key% Down}
KeyWait, %Key%, U		; Ожидать отпуск клавиши.

R := (A_TickCount-Time)
If (R < 2000) {
 ToolTip, Меньше 2 сек. - отпускаем %Key%`n%R% мс.,0,0
 SendInput, {%Key% Up}
 Return
}
ToolTip, Зажимаем %Key%`n%R% мс.,0,0
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

6

Re: AHK: Залипание при недолгом нажатии клавиши.

В Windows залипание - это когда зажал ЛКМ на пару секунд, потом отпустил, а Windows ведёт себя так, будто ты и не отпускал ЛКМ. А чтобы выйти из этого состояния, нужно сделать короткий щелчок ЛКМ.

7

Re: AHK: Залипание при недолгом нажатии клавиши.

Для клавиатуры так можно:

Info := {delay: 2000}

Hook := InputHook("V")
Hook.KeyOpt("{All}", "N")
Hook.OnKeyDown := Func("OnKeyDown").Bind(Info)
Hook.OnKeyUp := Func("OnKeyUp").Bind(Info)
Hook.Start()
Return

OnKeyDown(Info, Hook, vk, sc) {
   if !Info[vk . sc]
      Info[vk . sc] := A_TickCount
   else if (!Info.timer && A_TickCount - Info[vk . sc] > Info.delay) {
      Timer := Info.timer := Func("SendKey").Bind( Format("vk{:x}sc{:x}", vk, sc) )
      SetTimer, % Timer, 30
      SoundBeep
   }
}

OnKeyUp(Info, Hook, vk, sc) {
   if !Info.timer
      Info[vk . sc] := ""
   else {
      if !Info.once
         Info.once := true
      else {
         Timer := Info.timer
         SetTimer, % Timer, Delete
         Info[vk . sc] := Info.once := Info.timer := ""
         Sleep, 30
         Send % "{" . Format("vk{:x}sc{:x}", vk, sc) . " Up}"
      }
   }
}

SendKey(key) {
   Send {%key% Down}
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Залипание при недолгом нажатии клавиши.

Слишком сложно для понимания.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

9

Re: AHK: Залипание при недолгом нажатии клавиши.

Просто запустите скрипт, откройте блокнот, удерживайте любую печатную клавишу в течение двух секунд (до сигнала SoundBeep).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Залипание при недолгом нажатии клавиши.

__Михаил__ Спасибо большое за попытку но к сожалению как то не работает.
teadrinker Спасибо. Ваш код работает как нужно. Единственно можно как-то его применить к определенной кнопке а не на всю клавиатуру сразу?

11

Re: AHK: Залипание при недолгом нажатии клавиши.

Замените {All} на клавишу/список клавиш, которые нужны, как описано здесь. Например, для клавиш a, b, и c так:

Hook.KeyOpt("abc", "N")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Залипание при недолгом нажатии клавиши.

teadrinker Очень благодарен! Спасибо.

13

Re: AHK: Залипание при недолгом нажатии клавиши.

Рад помочь!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: Залипание при недолгом нажатии клавиши.

SHOX
Рассчитано только для клавиш мыши (ЛКМ и ПКМ).

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

15

Re: AHK: Залипание при недолгом нажатии клавиши.

teadrinker
Как применить я понял сразу - '{All}' мне известно давно, ещё когда изучал этот тип перехвата в своей теме.
Другое дело, что используется таймер, но через использование объекта / функции. Да ещё и '.Bind' который я так понимаю указывает параметры для вызова в функции что будет выполняться.
Чтобы собрать такую конструкцию нужно понимать как это всё работает, только вот где про это нормально написано? В стандартной справке есть один пример, да и то через Класс.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

16

Re: AHK: Залипание при недолгом нажатии клавиши.

__Михаил__, давайте по порядку, я так не понимаю, на что отвечать. Что первое не понятно?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Залипание при недолгом нажатии клавиши.

В целом, разбирая логику вашего кода становится понятно что и как устроено.
Разве что про '.Bind' хотелось бы узнать побольше.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

18

Re: AHK: Залипание при недолгом нажатии клавиши.

Немного подправил код, переменная sticky лишней оказалась.
Bind здесь используется для того, чтобы передать лишний параметр в OnKeyDown и OnKeyUp. Изначально там по три параметра:

The function is passed the following parameters: InputHook, VK, SC

Я с помощью Bind передаю ещё один — объект Info, в который записываются данные. Параметры, передаваемые с помощью Bind, помещаются перед остальными параметрами:

OnKeyUp(Info, Hook, vk, sc)

Вместо этого можно было бы объявить объект Info глобальным.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK: Залипание при недолгом нажатии клавиши.

Снова отсылка на то, что глобальные переменные = зло?
Но тут лишний геморрой с установкой массива 'Info' в функции.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

20

Re: AHK: Залипание при недолгом нажатии клавиши.

Не вижу особого геморроя. Когда вместо того, чтобы делать переменную глобальной, она передаётся через параметр, то сразу понятно, откуда она взялась и как тут появилась. Когда код большой, это может быть критично.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21 (изменено: __Михаил__, 2021-05-16 04:55:33)

Re: AHK: Залипание при недолгом нажатии клавиши.

Сварганил интерфейс с настройками:

#SingleInstance Force	;16.05.2021	http://forum.script-coding.com/viewtopic.php?id=16354
#NoEnv
SetBatchLines -1
;-----------
Global Info, Info := {}
;-----------
Gui +Caption +LastFound +SysMenu +ToolWindow +AlwaysOnTop
Gui Color, 0x997799
Gui Add, Button, vBT gSW x115 y40 w70 h23, Запуск
Gui Add, Edit, vKeys x64 y8 w120 h21, Все
Gui Add, Text, x8 y8 w50 h23 +0x200, Клавиши:
Gui Add, Edit, vDelay x72 y40 w40 h21 +Number, 2000
Gui Add, Text, x8 y40 w55 h23, Задержка:
Gui Show, w191 h66, [Авто-нажатие клавиш]
Return
;-----------
GuiEscape:
GuiClose:
ExitApp
;-----------
SW:
Gui, Submit, NoHide
If (SW := !SW){
 Info["Delay"] := Delay
 Hook := InputHook("V")
 If (Keys = "Все")
  Keys = {All}
 Hook.KeyOpt(Keys, "N")
 Hook.OnKeyDown := Func("OnKeyDown")
 Hook.OnKeyUp := Func("OnKeyUp")
 Hook.Start()
 GuiControl,, BT, Стоп
 GuiControl, Disable, Keys
 GuiControl, Disable, Delay
}
Else{
 Hook.Stop()
 GuiControl,, BT, Запуск
 GuiControl, Enable, Keys
 GuiControl, Enable, Delay
}
Return
;-----------
OnKeyDown(Hook, vk, sc) {
 if !Info[vk . sc]
  Info[vk . sc] := A_TickCount
 else if (!Info.timer && A_TickCount - Info[vk . sc] > Info.delay) {
  Timer := Info.timer := Func("SendKey").Bind( Format("vk{:x}sc{:x}", vk, sc) )
  SetTimer, % Timer, 30
  SoundBeep
 }
}

OnKeyUp(Hook, vk, sc) {
 if !Info.timer
  Info[vk . sc] := ""
 else {
  if !Info.once
   Info.once := true
  else {
   Timer := Info.timer
   SetTimer, % Timer, Delete
   Info[vk . sc] := Info.once := Info.timer := ""
   Sleep, 30
   Send % "{" . Format("vk{:x}sc{:x}", vk, sc) . " Up}"
  }
 }
}

SendKey(key){
 Send {%key% Down}
}

;-----------
F4:: ExitApp
F6:: Reload
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101