1

Тема: Разовый выстрел при нажатии и удержании t

Здравствуйте, помогите изменить код так, чтобы при удержании кнопки "t" нажатие левой клавиши мыши было только 1 раз. В данный момент после удержания "t" идёт быстрое нажатие лкм. Заранее спасибо.

Threshold = 15
;
*~$t::
MouseGetPos, MouseX, MouseY
PixelGetColor, Color1, (MouseX+2), (MouseY+2)
StringSplit, Colorz, Color1
Color1B = 0x%Colorz3%%Colorz4%
Color1G = 0x%Colorz5%%Colorz6%
Color1R = 0x%Colorz7%%Colorz8%
Color1B += 0
Color1G += 0
Color1R += 0
 
while (GetKeyState("t", "P"))
    {
        BlockInput, MouseMove
        sleep 1
        MouseGetPos, MouseX, MouseY
        PixelGetColor, Color2, (MouseX+2), (MouseY+2)
        StringSplit, Colorz, Color2
        Color2B = 0x%Colorz3%%Colorz4%
        Color2G = 0x%Colorz5%%Colorz6%
        Color2R = 0x%Colorz7%%Colorz8%
        Color2B += 0
        Color2G += 0
        Color2R += 0
        if (Color1R > (Color2R + Threshold)) or (Color1R < (Color2R - Threshold)) or (Color1G > (Color2G + Threshold)) or (Color1G < (Color2G - Threshold)) or (Color1B > (Color2B + Threshold)) or (Color1B < (Color2B - Threshold))
            {
                send {LButton}
            }
    }
BlockInput, MouseMoveOff
Return
 
End::
exitapp
return

2 (изменено: Indomito, 2017-02-21 17:39:26)

Re: Разовый выстрел при нажатии и удержании t

wowo
Ошибка в определении горячей клавиши: *~$t:: - идёт пропуск в систему, а не перехват, убери ~

+ Из справки по AHK

В момент запуска обработчика этой горячей клавиши нельзя подавить системную обработку этого действия. В обоих примерах, приведенных ниже, щелчок кнопки мыши, сделанный пользователем, будет послан активному окну, чего не произошло бы при обработке иных горячих клавиш, о которых идёт речь в данной статье:
~RButton::MsgBox Вы щелкнули правой кнопкой мыши.
~RButton & C::MsgBox Вы нажали клавишу C, удерживая правую кнопку мыши.

Проще написать так.

#Persistent
  keyShot := "vk54" ;Используем vk-Code, это код клавиши Eng = t or T RUS = е or Е
  HotKey %keyShot%, lShot, On
Return

#UseHook, On
lShot:
  HotKey %keyShot%, lNop, On ;На заглушку
  Send {LButton}
  Sleep 25
  while (GetKeyState(keyShot, "P"))
      Sleep 25
  HotKey %keyShot%, lShot, On ;На обработчик
Return

;П.программа-заглушка
lNop:
Return

Esc::
  ExitApp
#UseHook, Off

Я ответил только на вопрос, увидел ошибку и дал решение.

Удачи.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

3

Re: Разовый выстрел при нажатии и удержании t

Дело в том, что надо производить 1 выстрел после того, как по середине прицела произойдёт движение. В данном случае выстрел происходит без каких либо ожиданий движений, а просто по нажатию на "t".

Модератор: Дубликат кода удалён. Следите за точками в конце предложений. Ознакомление с правилами форума (см. его шапку) обязательно.

4 (изменено: Indomito, 2017-02-23 09:50:19)

Re: Разовый выстрел при нажатии и удержании t

wowo
Значит в условие надо прописать ожидание, я его вижу условие - просто используй мой скрипт в своём скрипте.
Думаю, что сам это сможешь, если нет, то надо ставить вопрос иначе.

Копировать мой код в своём посте не надо. Исправлено модератором(Пост №3) .

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

5

Re: Разовый выстрел при нажатии и удержании t

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

Threshold = 20
;
*$t::
MouseGetPos, MouseX, MouseY
PixelGetColor, Color1, (MouseX+2), (MouseY+2)
StringSplit, Colorz, Color1
Color1B = 0x%Colorz3%%Colorz4%
Color1G = 0x%Colorz5%%Colorz6%
Color1R = 0x%Colorz7%%Colorz8%
Color1B += 0
Color1G += 0
Color1R += 0

while (GetKeyState("t", "P"))
    {
        BlockInput, MouseMove
        sleep 1
        MouseGetPos, MouseX, MouseY
        PixelGetColor, Color2, (MouseX+2), (MouseY+2)
        StringSplit, Colorz, Color2
        Color2B = 0x%Colorz3%%Colorz4%
        Color2G = 0x%Colorz5%%Colorz6%
        Color2R = 0x%Colorz7%%Colorz8%
        Color2B += 0
        Color2G += 0
        Color2R += 0
        if (Color1R > (Color2R + Threshold)) or (Color1R < (Color2R - Threshold)) or (Color1G > (Color2G + Threshold)) or (Color1G < (Color2G - Threshold)) or (Color1B > (Color2B + Threshold)) or (Color1B < (Color2B - Threshold))
            {
                #Persistent
  keyShot := "vk54" ;Используем vk-Code, это код клавиши Eng = t or T RUS = е or Е
  HotKey %keyShot%, lShot, On
Return

#UseHook, On
lShot:
  HotKey %keyShot%, lNop, On ;На заглушку
  Send {LButton}
  Sleep 25
  while (GetKeyState(keyShot, "P"))
      Sleep 25
  HotKey %keyShot%, lShot, On ;На обработчик
Return

;П.программа-заглушка
lNop:
Return

Esc::
  ExitApp
#UseHook, Off
            }
    }
BlockInput, MouseMoveOff
Return

End::
exitapp
return


6 (изменено: Indomito, 2017-02-23 13:17:40)

Re: Разовый выстрел при нажатии и удержании t

wowo
Да, ты круто скрестил два скрипта — это я шучу.

Ошибки.

  • Двойное определении *$t:: и HotKey %keyShot%, lShot, On - это одно и тоже.

  • Директива #Persistent должна находится в начале скрипта.

  • Директива #Persistent не требуется, если определена "горячая" клавиша *$t::.

  • Мой фрагмент(скрипт) работает по принципу - нажал/отжал, т.е. для второго его надо опять нажать, а тут...

  • Измени присвоение/определения своих переменных с =  на  := — так наиболее правильно.

  • Действия такого кода не предсказуемы... ну почти.

Попробую исправить твой скрипт.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

7

Re: Разовый выстрел при нажатии и удержании t

Вот мой вариант:

Threshold = 20

$vk54:: ;t  

MouseGetPos, MouseX, MouseY
PixelGetColor, Color1, (MouseX+2), (MouseY+2)

Color1R := (Color1 >> 16) & 0xFF
Color1G := (Color1 >> 8) & 0xFF
Color1B := (Color1 >> 0) & 0xFF

While GetKeyState(RegExReplace(A_ThisHotkey,  "^.*?(vk.*)","$1")	,	"P")
{
	MouseGetPos, MouseX, MouseY
	PixelGetColor, Color2, (MouseX+2), (MouseY+2)
	
	Color2R := (Color2 >> 16) & 0xFF
	Color2G := (Color2 >> 8) & 0xFF
	Color2B := (Color2 >> 0) & 0xFF

	if (Color1R > (Color2R + Threshold))
	or (Color1R < (Color2R - Threshold))
	or (Color1G > (Color2G + Threshold))
	or (Color1G < (Color2G - Threshold))
	or (Color1B > (Color2B + Threshold))
	or (Color1B < (Color2B - Threshold))
	{
		Click D
		Sleep 50
		Click U
		Break
	}
	Sleep 10
}

KeyWait,% RegExReplace(A_ThisHotkey,  "^.*?(vk.*)","$1")
Return
+ с комментариями
Threshold = 20 ; Порог Срабатывания 

$vk54:: ;t  Зажимаем клавишу t\е


;Смотрим позицию курсора
; и получаем текущий цвет что под курсором.
MouseGetPos, MouseX, MouseY
PixelGetColor, Color1, (MouseX+2), (MouseY+2)

; Цвет Получен в шестнадцатеричной системе счисления(hex), Содержит три цифры оттнеков Red Green Blue от 0 до 255(или 0x0 до 0xFF)
; Переводим каждое значение оттненка в отдельную переменную.

Color1R := (Color1 >> 16) & 0xFF
Color1G := (Color1 >> 8) & 0xFF
Color1B := (Color1 >> 0) & 0xFF

; Запускаем цикл, остоновится при том условии если отжата клавиша начавшая этот поток.
; RegExReplace уберает модификаторы в начале такие как ~ $ ^ + и т.д.
While GetKeyState(RegExReplace(A_ThisHotkey,  "^.*?(vk.*)","$1")	,	"P")
{
	; Получаем второй цвет 
	MouseGetPos, MouseX, MouseY
	PixelGetColor, Color2, (MouseX+2), (MouseY+2)
	
	Color2R := (Color2 >> 16) & 0xFF
	Color2G := (Color2 >> 8) & 0xFF
	Color2B := (Color2 >> 0) & 0xFF

	;Если это условие истина то  кликаем лкм и останавливаем цикл.
	if (Color1R > (Color2R + Threshold))
	or (Color1R < (Color2R - Threshold))
	or (Color1G > (Color2G + Threshold))
	or (Color1G < (Color2G - Threshold))
	or (Color1B > (Color2B + Threshold))
	or (Color1B < (Color2B - Threshold))
	{
		Click D
		Sleep 50
		Click U
		Break
	}
	Sleep 10
}

; Если скрипт перешел сюда, то это значит либо отжата клавиша T или был клик мыши в нужном месте.
; Ждем отжатия клавиши T.
KeyWait,% RegExReplace(A_ThisHotkey,  "^.*?(vk.*)","$1")
Return

8 (изменено: Indomito, 2017-02-23 13:29:02)

Re: Разовый выстрел при нажатии и удержании t

wowo
Пока правил, много что надо было учесть, тебе ответил yalanne — это более простой вариант.

yalanne
Кстати можно обойтись без цикла, просто использовать HotKey и функцию со статическими переменными.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

9

Re: Разовый выстрел при нажатии и удержании t

Indomito если флудить зажатой кнопкой, то будет вышибать ошибку:
http://i.imgur.com/4JQO8I7.png
Тем более из за меток будет по объему больше скрипт.