Ru-Board.club
← Вернуться в раздел «Программы»

» AutoHotkey

Автор: amigosxxx
Дата сообщения: 09.04.2014 06:15
creature_ws

Ясно, но как тогда мне сделать, чтобы при нажатии боковых кнопок Х1 и Х2, у меня включался этот скрипт:


Код:
#NoEnv
SendMode Input

_auto := true ;Toggle for the anti-recoil being on or off. default is on
~LButton::autofire() ; When the LButton is pressed run the autofire() function
!LButton::_auto := ! _auto ;Alt + LButton used to toggle the anti-recoil on and off
F1::ExitApp ; F1 used to exit the ahk script file

; autofire() function, name is misleading could easily be antiRecoil()
autofire()
{
global _auto
if _auto ; if _auto == true. i.e. is anti-recoil on?
{ ; anti-recoil on? If yes do this
Loop ; Continuously loop until a 'break' command
{
if GetKeyState("LButton", "P") ; If LButton is pressed
{ ; LButton pressed? If yes do this
Sleep 75 ; sleep for 85 milliseconds
mouseXY(0, 70) ;Call the mouseXY() function which moves the mouse the specified distance. mouseXY( X, Y,)
Sleep 45 ; sleep for 45milliseconds
}
else ;LButton pressed? If no do this, i.e. exit the loop
break ;will stop the loop
} ;; loop
} ;; if
} ;; autofire() ; anti-recoil on? If no do nothing

mouseXY(x,y)
{
DllCall("mouse_event",uint,1,int,x,int,y,uint,0,int,0) ; moves the mouse could easily be the built in autohotkey MouseMove, X, Y
}
Автор: creature_ws
Дата сообщения: 09.04.2014 11:02

Код: Xbutton1::
Xbutton2::
KeyWait LButton, D
if (A_ThisHotkey = "Xbutton1")
Autofire(-10,10, 40, "LButton")
else
Autofire(20,-20, 200, "LButton")
return

Autofire(x, y, timer, button) {
while GetKeyState(button, "P") {
Click
MouseMove x, y, 0, R
Sleep timer
}
}
Автор: amigosxxx
Дата сообщения: 09.04.2014 11:43
creature_ws

Спасибо!
По поводу цитаты - править не стал эту опечатку)

Сейчас все же хочу переделать ваш скрипт
Идея в том, что при нажатой кнопки Ctrl и ЛКМ у меня будет еще один вариант сдвига курсора и задержки (прошу прощения, что его не описал в объяснении).
Т.е. нажал кнопку Х1, отпустил. Если ее нажимал то жду двух вариантов: 1) нажатие просто ЛКМ, ее удержание или 2) нажатие ЛКМ и Ctrl и их удержание. И уже далее у каждого варианта свой выбор - пока держу ЛКМ (+Ctrl) действует циклическая очередь: клик, сдвиг, задержка. Также и для Х2
Вот потому тут и встал вопрос, можно ли использовать в вашей функции не только LButton но и ^LButton.


Код:
#NoEnv ; не знаю для чего это
SendMode Input ; не знаю для чего это
_auto := true; по умолчанию включена функция Autofire
!LButton::_auto := ! _auto; отключение работы функции Autofire
F3::ExitApp; закрытие скрипта на F3
Xbutton1::
Xbutton2::
#IfWinActive, PlayRust; Если запущено окно РАСТ
{
KeyWait LButton, D ; ждем нажатие ЛКМ
if (A_ThisHotkey = "Xbutton1") ; если нажата была Х1
Autofire(-10,10, 40, "LButton") ; то выполнение этой функции
else ; иначе
Autofire(20,-20, 200, "LButton") ; выполнение этой функции
return ; выход
}

Xbutton1::
Xbutton2::
KeyWait ^LButton, D ; если нажат Ctrl+ЛКМ - этот кусок не работает с первым
if (A_ThisHotkey = "Xbutton1")
Autofire(-10,10, 40, "LButton")
else
Autofire(20,-20, 200, "LButton")
return

Autofire(x, y, timer, button); функция Autofire (смещение по X,Y, задержка между кликами; какая кнопка нажимается)
{
global _auto
if _auto ; Если Функция включена
{
while GetKeyState(button, "P") ; пока кнопка мыши нажата
{
Click ; клик
MouseMove x, y, 0, R ; сдвиг курсора мышки
Sleep timer ; задержка
}
}
else ; если переменная _auto=false
break ; то выход
}
Автор: creature_ws
Дата сообщения: 09.04.2014 11:57
Мне не понятно, что вам не понятно. Ваш стиль «тащить в код всё что вижу» не располагает продолжать диалог.
Автор: amigosxxx
Дата сообщения: 09.04.2014 12:22
Ваш код мне ясен, но я не могу понять, как учесть действие КТРЛ+ЛКМ. В Вашем коде этого нет, вот я и советуюсь, как его добавить. Конечно можно запустить 2 скрипта - один отслеживает нажатие только ЛКМ, а другой КТРЛ+ЛКМ. Поменять нужно будет лишь кнопку в Autofire(20,-20, 200, "LButton") на Autofire(20,-20, 200, "^LButton")
Остальные условия я добавил как помощь, чтобы скрипт не работал в других окнх, чтобы можно было отключить саму функцию. Разве это плохо?
Автор: creature_ws
Дата сообщения: 09.04.2014 12:30

Цитата:
Поменять нужно будет лишь кнопку в Autofire(20,-20, 200, "LButton") на Autofire(20,-20, 200, "^LButton")

Неправда, GetKeyState не приемлет параметры типа "^LButton".

Цитата:
я не могу понять, как учесть действие КТРЛ+ЛКМ

Узнать нажат ли control можно с помощью GetKeyState

Цитата:
else ; если переменная _auto=false
break ; то выход

break это выход из цикла.

Что важнее клик левой кнопкой или нажатие Xbutton? «стрельба» должна происходить при зажатой Lbutton или при зажатой Lbutton и Xbutton, или при зажатом Ctrl и Lbutton или при зажатом Ctrl и Lbutton и Xbutton? или нажатие любой из этих кнопок должно предшествовать клику левой кнопки?
Видите как много вариантов

Чтобы решить задачу её сперва надо сформулировать.
Автор: amigosxxx
Дата сообщения: 09.04.2014 13:05
Ок.
Ща распишу с примерами. Думаю, и мне тогда станет ясно.
1. Производится кратковременное нажатие боковой кнопки 4 или 5 (Х1 или Х2).
2. Определяется какая из кнопок была нажата. Но на обе кнопки выполняется одна и та же задача, но с разными параметрами.
3. Ждем нажатия кнопки ЛКМ или ЛКМ+КТРЛ.
4. В зависимости от того, была нажата ли ЛКМ или ЛКМ+КТРЛ выполняем, пока нажаты ЛКМ или КТРЛ+ЛКМ, соответственно циклическую очередь задач: клик ЛКМ, сдвиг курсора мышки, задержка.

Итого, задача выполняется одна и та же при нажатии ЛКМ или ЛКМ+КТРЛ, но с разными вариации задержки и сдвига мыши.
Х1 и Х2 лишь предварительные действия, которые также влияют на показания задержки и сдвига мыши. Итого имеем 4 вариации:
1) Х1 был нажат, а потом ЛКМ
2) Х2 был нажат, а потом ЛКМ
3) Х1 был нажат, а потом ЛКМ+КТРЛ
4) Х2 был нажат, а потом ЛКМ+КТРЛ
И у каждого варианта свои будут задержки и сдвиги мышки.

Еще хотел бы все же включить выклчюение скрипта по горячей клавише, например F3.
И возможность отключить саму функцию сдвига и задержки, т.е. нажатие ЛКМ это просто нажатие ЛКМ и ничего более.

Теперь пример.
Х1 - выбор оружия Автомат
Х2 - выбор оружия Пистолет
КТРЛ - стрельба от бедра
ЛКМ - выстрел.
Сам сдвиг и задержка производится для снижения уровня отдачи после выстрела.
Она у Пистолета и Автомата разные, как и при выстреле от бедра и стоя.

Т.е. я выбираю боковой кнопкой мыши орудие, далее выбираю позу: стоя или сидя (стрельба от бедра) и далее стреляю (ЛКМ), удерживая саму позицию нажатием КТРЛ ,если веду стрельбу от бедра.

Думаю, теперь все, что смог описал.

Вот например написал так. Ошибок не выдает. Но у меня сомнения, правильно ли скрипт сработает, если я отпущу КТРЛ. Должен бы перейти на режим стрельбы стоя, но не знаю как скрипт работает - в круговую или как.


Код:
F3::ExitApp
_auto := true
!LButton::_auto := ! _auto
Xbutton1::
Xbutton2::
#IfWinActive, PlayRust
{
KeyWait LButton, D
if (A_ThisHotkey = "Xbutton1")
{
if GetKeyState(Control, "P")
Autofire1(0,10, 40, "LButton")
else
Autofire2(0,-20, 200, "LButton")
}
else
{
if GetKeyState(Control, "P")
Autofire1(0,10, 40, "LButton")
else
Autofire2(0,-20, 200, "LButton")
}
return
}

Autofire1(x, y, timer, button)
{
while GetKeyState(Lbutton, "P")
{
Click
MouseMove x, y, 0, R
Sleep timer
}
}

Autofire2(a, b, timer, button)
{
while GetKeyState(Lbutton, "P")& GetKeyState(Control, "P")
{
Click
MouseMove a, b, 0, R
Sleep timer
}
}
Автор: creature_ws
Дата сообщения: 09.04.2014 13:49

Код: fireCorrectionMode := [[[-10, 10, 40], [-10, 10, 40]], [[-10, 10, 40], [-10, 10, 40]]]

/* пояснение синтаксиса:

[ внешние квадратные скобки охватывают 2 типа оружия
внутри каждого оружия описаны два режима стрельбы

[ первый тип оружия
[-10, 10, 40], первый режим (выполнится после нажатия xbutton1 при нажатом LСontrol)
[-10, 10, 40] второй режим (выполнится после нажатия xbutton1 при отпущенном LСontrol)
],

[ второй тип оружия
[-10, 10, 40], первый режим (выполнится после нажатия xbutton2 при нажатом LСontrol)
[-10, 10, 40] второй режим (выполнится после нажатия xbutton2 при отпущенном LСontrol)
]
]
*/


F3::toggleHotkeys := !toggleHotkeys ; нажатие f3 переключает состояние горячих клавиш

#if toggleHotkeys
~Xbutton1::gunType := 1 ; нажатие Xbutton определяет тип оружия и разрешает выполнение ~*LButton
~Xbutton2::gunType := 2

#if gunType && toggleHotkeys
~*LButton:: ; если Xbutton была нажата и F3 разрешает выполнение горячих клавиш
fireMode := GetKeyState("LControl")? 1 : 2 ; определяем режим стрельбы
Autofire(fireCorrectionMode[gunType, fireMode]*) ; выбираем тип коррекции отдачи
gunType := 0 ; сбрасываем состояние типа оружия ( чтоб небыло двойного срабатывания)
return
#if

Autofire(x, y, timer) {
while GetKeyState("LButton", "P") {
Click
MouseMove x, y, 0, R
Sleep timer
}
}
Автор: amigosxxx
Дата сообщения: 09.04.2014 13:55
creature_ws
Спасибо огромное! Этот скрипт по синтаксису намного проще и универсальнее!
Еще раз спасибо! Буду пробовать!

PS

Код:
#if gunType && toggleHotkeys
~*LButton:: ; если Xbutton была нажата и F3 разрешает выполнение горячих клавиш
fireMode := GetKeyState("LControl")? 1 : 2 ; определяем режим стрельбы
Autofire(fireCorrectionMode[gunType, fireMode]*) ; выбираем тип коррекции отдачи
gunType := 0 ; сбрасываем состояние типа оружия ( чтоб небыло двойного срабатывания)
return
#if
Автор: creature_ws
Дата сообщения: 09.04.2014 14:26
Предыдущее сообщение отредактировано, про #if и прочее можно почитать в справке, в данном случае #if предупреждает случайные ошибки того, кто будет редактировать скрипт после меня.
Автор: amigosxxx
Дата сообщения: 09.04.2014 14:53
Спасибо!
Вроде разобрался, что значат mode[] - это ячейка из [x,y,t1], что будет выбрана из 4-х.
Если все так, то немного дополнил скрипт на очередь выстрелов.

Еще раз очень благодарен.
Теперь действительно можно менять "на ходу" и оружие и положение тела, и автоматически будут внесены корректировки в режим стрельбы.

Стоп...
Наверно строчка gunType := 0 лишняя будет, т.к. если я прекращу стрелять (отожму ЛКМ) и потом вновь захочу стрелять, у меня будет считаться, что орудие не выбрано. Т.е. всегда придется сначало нажимать на боковую кнопку и лишь потом стрелять.
Пусть лучше сохранить последнее нажатие боковой кнопки мыши.


Код:
fireCorrectionMode := [[[-20, -20, 100, 100], [20, 20, 100, 100]], [[-20, 20, 100, 100], [20, -20, 100, 100]]]
F10::ExitApp
F3::toggleHotkeys := !toggleHotkeys

#if toggleHotkeys
~Xbutton1::gunType := 1
~Xbutton2::gunType := 2

#if gunType && toggleHotkeys
~*LButton::
Autofire()
return
#if

Autofire()
{
global gunType, fireCorrectionMode

while GetKeyState("LButton", "P")
{
mode := fireCorrectionMode[gunType, GetKeyState("LControl", "P")? 1 : 2]
Click down
    Sleep mode[4]
MouseMove mode[1], mode[2], 0, R
    Click up
Sleep mode[3]
}
}
Автор: creature_ws
Дата сообщения: 10.04.2014 11:40
Как зажать клавишу
Автор: amigosxxx
Дата сообщения: 10.04.2014 13:29
Спасибо большое!! Я уже на том форуме искал подобную тему по названию и нашел другую и там сделал запрос и удалил.

Добавлено:
Взял скрипт от туда, подретушировал и не работает он. Он отжимает через раз.
Как быть?

Код:
F3::
If isKeyPressed := !isKeyPressed
SetTimer, SendA, 40
Else
{
SetTimer, SendA, Off
Send {LShift Up}
Send {H Up}
}
KeyWait F3
return

SendA:
Send {LShift Down}
Send {H Down}
return
Автор: SKYNET3000
Дата сообщения: 21.04.2014 07:32
Пацоны! Хлэп ми!
Какой функцией AutoHotKey_L можно скопипастить выделенный текст в броузере фиревокс?

Но не просто выделенный текст, а исходный код выделенного фрагмента.
Т.е. текст вместе с HTML-разметкой.

А?

Добавлено:
Что я хочу-то?
Хочу чтобы было достаточно выделить на веб-страничке нужный мне фрагмент текста и в буфере оказывалась что-то типа
Код: <span class="post">Пацоны! Хлэп ми! <br> Какой функцией AutoHotKey_L можно скопипастить выделенный текст в броузере фиревокс? <br> &nbsp;<br> Но не просто выделенный текст, а исходный код выделенного фрагмента. <br> Т.е. текст вместе с HTML-разметкой. <br> &nbsp;<br> А?<img src="http://i.ru-board.com/s/type.gif" border="0"></span>
Автор: begrutzer
Дата сообщения: 26.04.2014 10:32
Подскажите пожалуйста!

У меня есть скрипт и мне надо, чтобы он работал если мышь над контролом Edit в Проводнике Windows, но НЕ работал в Notepad. Просто чтоб Notepad он игнорировал.
С первой частью я справился
Код: #If (WinActive ("ahk_class CabinetWClass")) AND (ActiveControlIsOfClass("Edit"))
Автор: creature_ws
Дата сообщения: 26.04.2014 12:33

Цитата:
не даёт нужного результата

чтобы узнать какой результат требуется отправьте смс на короткий номер […]

Директивы #if влияют лишь на нижележащие горячие клавиши.
Директива это не "слушатель событий", а условие выполняющееся перед стартом подпрограмм горячих клавиш, попадающих под влияние директивы.
Словом «скрипт» принято называть файл содержащий сценарий работы интерпретатора.
Обычно дальше третьей строки никто не читает.
Определитесь, что имеете в виду под «скрипт» и что значит «чтобы он работал».
Автор: begrutzer
Дата сообщения: 26.04.2014 13:11

Цитата:
Определитесь, что имеете в виду под «скрипт» и что значит «чтобы он работал».

Вкратце содержание файла ahk:

Код: rbutton::
bla bla
rbutton up::
bla bla
Автор: creature_ws
Дата сообщения: 26.04.2014 13:49
Теперь понятно

Замените WinActive("ahk_class CabinetWClass") на MouseIsOver("ahk_class CabinetWClass")
и добавьте в тело скрипта функцию


Код: MouseIsOver(window*) {
MouseGetPos,,, hwnd
window[1] .= " ahk_id" hwnd
return WinExist(window*)
}
Автор: begrutzer
Дата сообщения: 26.04.2014 17:18
Спасибо creature_ws!

А как бы ещё сделать, чтобы скрипт действовал и в диалогах?
Я пока что добавил в первую часть своего условия (SetTitleMatchMode, RegEx само собой)

Код: OR (WinActive("^Выберите файлы|^Введите имя файла"))
Автор: creature_ws
Дата сообщения: 26.04.2014 17:55
Не лучший. Лучше в начале скрипта определить группу окон над которыми должна срабатывать подпрограмма правой кнопки мыши, а в условии указать MouseIsOver("ahk_group ИмяГруппы)
Автор: begrutzer
Дата сообщения: 26.04.2014 19:22

Код: Лучше в начале скрипта определить группу окон над которыми должна срабатывать подпрограмма правой кнопки мыши, а в условии указать MouseIsOver("ahk_group ИмяГруппы)
Автор: creature_ws
Дата сообщения: 26.04.2014 20:17

Цитата:
У меня MouseIsOver никак не хочет работать



Код: GroupAdd Explorer, ahk_class CabinetWClass
GroupAdd Explorer, ahk_class #32770

#if MouseIsOver("ahk_group Explorer")
~LButton::SoundBeep

MouseIsOver(window*) {
MouseGetPos,,, hwnd
window[1] .= " ahk_id" hwnd
return WinExist(window*)
}
Автор: begrutzer
Дата сообщения: 26.04.2014 22:22

Цитата:
У меня «работает».

У меня в диалоговых окнах не бипает, пока не напишу для них #ifWinActive.
Ну и бог с ним.

Спасибо большое ещё раз за помощь!
Автор: vadim3sh
Дата сообщения: 08.05.2014 03:33
Привет
Ребят, токо ногами не бейте, что-то ум за разум зашел... Совсем мозгам хрю..


Код: #Persistent
ToolTip, RUSSIAN
SetTimer, RemoveToolTip, 5000
return

RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
Return
Автор: user7c7
Дата сообщения: 11.05.2014 21:06
Пытаюсь создать свой первый скрипт. Нужно, чтобы по ctrl+alt+p скрипт приостанавливался.
Что не так?

Автор: vadim3sh
Дата сообщения: 11.05.2014 22:37
user7c7
не разбирался, что там должно происходить , но скрипт "как есть" у меня запускается без ошибки..
win7
Автор: user7c7
Дата сообщения: 11.05.2014 23:09
vadim3sh
Очень странные вещи... поменял местами 2 строчки скрипта и ошибку выдавать перестал...

Еще вопрос, как можно сделать, чтобы написанный скрипт повторялся снова и снова, пока я сам его не остановлю?
Автор: SKYNET3000
Дата сообщения: 12.05.2014 18:38
user7c7
Какое красивое окошко. Я такого ниразу не видел. Хотя автохоткей юсаю уже лет 8
Автор: oshizelly
Дата сообщения: 18.05.2014 19:01
Прочёл недавно в другой теме, что можно написать скрипт, который бы позволял выставить скобки, кавычки и прочих парных животных вокруг выделенного текста. Например:
1. Выделяем в тексте одно или несколько слов, допустим, "мама мыла раму
2. Жмём волшебную кнопку
3. Имеем тот же текст, но с кавычками или скобками и т.п. перед ним и после него.

Подскажите, пожалуйста, как такое сделать. Заранее спасибо!
Автор: vadim3sh
Дата сообщения: 18.05.2014 21:50
oshizelly
Вы, батенька, если я правильно понял задачу, изрядный лодырь однако...

Код: +^7::
SendInput, ^{vk43}
SendInput, 2
SendInput, ^{vk56}
SendInput, 2
return

Страницы: 12345678910111213141516171819202122232425262728293031323334

Предыдущая тема: как добавить ивритские шрифты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.