Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AutoHotkey

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

Открыть новую тему     Написать ответ в эту тему

chum2000

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

   
 
Актуальная версия: AutoHotkey 2.0.5 от 12 августа 2023
Версия для Windows XP | Changes from v1.1 to v2.0
 
Официальный сайт | Англоязычный форум | Архивный форум | Русскоязычный форум
Документация (англ.) | Документация и статьи (рус.) | История изменений
 
Подборка полезных скриптов | AutoHotkey + Total Commander
 

Цитата:
AutoHotkey — бесплатная программа с открытым исходным кодом для создания макросов и автоматизации, позволяющая упростить выполнение повторяющихся задач.
 
AutoHotkey позволяет изменить интерфейс практически любой программы. Имеет собственный скриптовый язык, специально нацеленный на лёгкое назначение и переназначение горячих клавиш.
 
AutoHotkey можно использовать для запуска программ, отправки текста, имитации мыши. Скриптовый язык позволяет управлять окнами, файлами и папками. Команды могут быть активированы горячими клавишами.
 
Также имеются возможности создания GUI, работы с реестром, использования собственного API окон для вызова DLL-файлов. Скрипты можно скомпилировать в EXE-файл и запускать на любом компьютере с Windows соответствующей версии.
 
Наиболее частое применение AutoHotkey:
- переназначение клавиш (глобально или у отдельных программ)
- управление мышью с помощью клавиатуры или джойстика
- слежение за системой, автоматическое выполнение некоторых действий по желанию пользователя, таких как напоминание, сканирование или резервное копирование
 

Всего записей: 505 | Зарегистр. 04-03-2004 | Отправлено: 00:28 02-06-2005 | Исправлено: Egor2020, 10:08 21-09-2023
OnMyDSeeAtAll



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пример был рассчитан на одноразовое использование, если Вам нужно повесить функционал на клавишу, тогда это может выглядеть так.
Цитата:
...Выше строки #NoEnv? Или где-то в середине?
Директивы Вы можете поместить в скрипте куда угодно, но исходя из здравого смысла лучше помещать их в первых строках кода, а клавиатурные назначения лучше всего разместить после всех строк с командами которые Вы хотите, что-бы выполнились при запуске сценария. Таким образом интерпретатор (АХК) прочтёт/выполнит всё до первой записи назначения клавиши в Вашем скрипте и остановится (что собственно он бы сделал если бы при чтении встретил на своём пути команду Return).
Цитата:
...что подразумевается под XButton2?
Сие правая (боковая) клавиша на пяти кнопочной мышке.

Всего записей: 100 | Зарегистр. 08-07-2011 | Отправлено: 21:27 30-03-2014
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кстати,

Цитата:
WinGet lpdwProcessId, PID, A

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 22:06 30-03-2014
OnMyDSeeAtAll



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, в курсе, просто всегда хочется альтернативы (+, это можно использовать в режиме inline как выражение в отличии от полноценной команды которая требует отдельной строки в коде).

Всего записей: 100 | Зарегистр. 08-07-2011 | Отправлено: 00:16 31-03-2014
funcMYXOMOP

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Пишу сюда уже в состоянии отчаяния сделать что-то самостоятельно.
Передо мной стоит задача: сделать Paste&Enter по нажатию Ctrl+Shift+V. Я написал эти строки, которые работают только в английской раскладке:  
 
^+v:: ; Ctrl + Shift + V
{
send ^v
send {Enter}
}
return
 
Я понимаю, что чтобы это работало в обоих раскладках, надо вместо v написать сканкод этой клавиши, но как его узнать, я не знаю. Кейхуком пользоваться не умею (Да и нет у меня его по ходу), гуглёж выдаёт сканкоды чего угодно, только не буквенных клавиш. Halp.

Всего записей: 3 | Зарегистр. 31-03-2014 | Отправлено: 12:00 31-03-2014 | Исправлено: funcMYXOMOP, 12:04 31-03-2014
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Virtual-Key Codes

Код:
^+vk56::Send ^{vk56}{Enter}

Сканкоды нажатых клавиш можно увидеть например так:

Код:
#InstallKeybdHook
loop {
    KeyHistory
    sleep 1000
}
 

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 13:52 31-03-2014 | Исправлено: creature_ws, 14:11 31-03-2014
funcMYXOMOP

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
creature_ws, спасибо!

Всего записей: 3 | Зарегистр. 31-03-2014 | Отправлено: 14:14 31-03-2014
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
--здесь была вызывающе неверная информация--

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 14:52 31-03-2014 | Исправлено: creature_ws, 16:22 31-03-2014
funcMYXOMOP

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Send ^{v}
 
А вот не работало, кстати. Отправляло "v" и Enter.
(Вообще у этой программы странная логика)

Всего записей: 3 | Зарегистр. 31-03-2014 | Отправлено: 15:06 31-03-2014
amigosxxx



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте!
Подскажет по двум вопросам!  
Как должен выглядеть скрипт, который при нажатии кнопки R и дальнейшем ее отпускании, нажимался и удерживался LShift. А при повторном нажатии кнопки R, Lshift отжимался.
Написал вот так, но где-то ошибка.
Делал Для игры Руст, потому проверка на активность этого окна. В остальном просто правил скрипт другого человека (у него было все сведено на колесико).
 

Код:
 
sc013::  
IfWinActive, PlayRust  
{  
SendInput, {LShift Down}  
return  
}
return  
 
sc013::  
IfWinActive, PlayRust  
{  
SendInput, {LShift Up}  
return  
}
return
 

 
В этом скрипте выдает ошибку, что у меня используется одна и та же команда в разных ситуациях.
Пока есть мысли с введением переменной, которая будет =1 в одной части конфига и по его исполнению обнуляться, а в другой части конфига ей будет присваиваться 1. Но мой вариант не работает.
Вот такой был вариант:

Код:
 
y=1;
if y=1
{
sc013::  
IfWinActive, PlayRust  
{  
SendInput, {LShift Down}  
return  
}
y=0;
return  
}
 
if y=0
{
sc013::  
IfWinActive, PlayRust  
{  
SendInput, {LShift Up}  
return  
}
y=1;
return  
}
 

 
Еще есть вопрос. Как организовать условие по нажатию 4 кнопки мыши по команде MouseClick, X1 и последующим нажатием ЛКМ производить такие то действия (планирую сдвиг координат мышки, задержку), если же не зажата ЛКМ, то ничего не производить.

Всего записей: 25 | Зарегистр. 12-03-2008 | Отправлено: 14:33 07-04-2014 | Исправлено: amigosxxx, 15:11 07-04-2014
vadim3sh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
amigosxxx

Цитата:
условие по нажатию 4 кнопки мыши по команде MouseClick, X1 и последующим нажатием ЛКМ  

я туплю, или как-то невнятно задача поставлена?
 
по первому скрипту.. можно предположить, что стОит где-то в такой плоскости поискать:

Код:
toggle = 0
#MaxThreadsPerHotkey 2
 
n::
Toggle := !Toggle
While Toggle{
Click
Send a
sleep 100
}
return
 
start this script, open notepad and press 'n' you'll see what i mean  

 
Пост вниз: Про первый скрипт... Имелось в виду обратить внимание на волшебное слово Toggle
 
Помню просто  мучался с похожей задачей, но когда это было.. сам делаю скрипты раз в год, все больше подворовываю мысли умных и одержимых людей. (как OnMyDSeeAtAll, например, спасибо ему еще раз за терпение и помощь). Так что каждый раз уже и забываю, где там что было
 

Всего записей: 457 | Зарегистр. 28-01-2006 | Отправлено: 05:14 08-04-2014 | Исправлено: vadim3sh, 11:42 08-04-2014
amigosxxx



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vadim3sh
 
Спасибо!
По нажатию 4 кнопки имеется в виду. Что если я нажал 4 кнопку, то при нажатии уже потом ЛКМ, нужно будет выполнить очередь задач - будет сдвиг, задержка.
Как пример. При нажатии на 4 кнопку, выбираю оружие, а при нажатии ЛКМ, я стреляю, при этом происходят выстрелы и снижение уровня отдачи с помощью сдвига курсора и задержек. Примерно так.
Вот в этот скрипт хочу включить это условие:
 

Код:
 #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
}
 

 
Пока написал вот такой на кнопку 4 мышки:

Код:
 
#NoEnv
SendMode Input
 
_auto := true ;Toggle for the anti-recoil being on or off. default is on
 
~XButton1::M4()
 
M4()
{
~^LButton::auto_fire()
~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() Reduces Recoil when only Left mouse button is pressed
autofire()
 {
  global _auto  
  if _auto  
   {  
    Loop  
     {
      if GetKeyState("LButton", "P")  ; If LButton is pressed
       {  
     
        Sleep 75 ; sleep for 85 milliseconds
        mouseXY(0, 20) ;Call the mouseXY() function which moves the mouse the specified distance. mouseXY( X, Y,)
        Sleep 45 ; sleep for 45milliseconds
       }
 
 
      else  
        break ;will stop the loop
     }  
   }  
 }  
 
auto_fire() ; Reduces recoil when ctrl is pressed
 {
    global _auto
    if _auto  
     {
      Loop
       {
                  if GetKeyState("LButton", "P")  ; If LButton is pressed (And ctrl)
       {  
     
        Sleep 75 ; sleep for 85 milliseconds
        mouseXY(0, 18) ;Call the mouseXY() function which moves the mouse the specified distance. mouseXY( X, Y,)
        Sleep 45 ; sleep for 45milliseconds
       }
 
 
     else  
        break  
     }  
   }  
 }
             
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
}
 

Но тут пишет, что не видит функции auto_fire(). Где ошибка не пойму.
 
По поводу 1 скрипта - выполнил пока проще - Нажимаю на однку клавишу - Шифт удерживается, при нажатии на другую (не на эту уже) клавишу, Шифт отжимается. Пока так получилось.

Код:
 
sc013::  
IfWinActive, PlayRust  
{  
SendInput, {LShift Down}  
return  
}  
return  
 
sc014::  
IfWinActive, PlayRust  
{  
SendInput, {LShift Up}  
return  
}  
return  
 

Всего записей: 25 | Зарегистр. 12-03-2008 | Отправлено: 07:07 08-04-2014 | Исправлено: amigosxxx, 12:40 08-04-2014
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я бы посоветовал не пытаться собрать из кусочков чужого скрипта свой. Это как взять текст на неизвестном языке, перемешать в нём предложения и ожидать, что текст сохранит свой первоначальный смысл.
 
Справка Autohotkey содержит ответы на все вопросы которые могут возникнуть относительно синтаксиса языка.
 
Если читать справку нет желания — опишите «что нужно» без чужого, непонятного вам кода — тогда по каждому пункту «задания» можно будет привести конкретный пример реализации решения.
 
———————
 

Код:
M4()
{
~^LButton::auto_fire()
~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
}
 

Не возьмусь даже предположить какое поведение вы ожидаете от этого участка кода.
~^LButton:: - метка горячей клавиши — начало отдельной подпрограммы
M4() { ... } определение функции. Интерпретатор не позволит вам определить подпрограмму горячей клавиши в теле функции.

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 16:49 08-04-2014
amigosxxx



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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  
}  
 

 
Исправил на следующий код:

Код:
 
#NoEnv
SendMode Input
 
_auto := true ;Toggle for the anti-recoil being on or off. default is on
 
~XButton1::
#IfWinActive, PlayRust
{
~^LButton::auto_fire1()
~LButton::autofire1() ; 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
}
 
~XButton2::
#IfWinActive, PlayRust
{
~^LButton::auto_fire2()
~LButton::autofire2() ; 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
}
 
; autofire1() Reduces Recoil when only Left mouse button is pressed
autofire1()
{
global _auto  
if _auto  
{  
Loop  
{
if GetKeyState("LButton", "P") ; If LButton is pressed
{  
Sleep 75 ; sleep for 85 milliseconds
mouseXY(0, 20) ;Call the mouseXY() function which moves the mouse the specified distance. mouseXY( X, Y,)
Sleep 45 ; sleep for 45milliseconds
}
else  
break ;will stop the loop
}  
}  
}  
 
auto_fire1() ; Reduces recoil when ctrl is pressed
{
global _auto
if _auto  
{
Loop
{
if GetKeyState("LButton", "P") ; If LButton is pressed (And ctrl)
{  
 
Sleep 75 ; sleep for 85 milliseconds
mouseXY(0, 18) ;Call the mouseXY() function which moves the mouse the specified distance. mouseXY( X, Y,)
Sleep 45 ; sleep for 45milliseconds
}
else  
break  
}  
}  
}
 
; autofire2() Reduces Recoil when only Left mouse button is pressed
autofire2()
{
global _auto  
if _auto  
{  
Loop  
{
if GetKeyState("LButton", "P") ; If LButton is pressed
{  
Sleep 75 ; sleep for 85 milliseconds
mouseXY(0, 20) ;Call the mouseXY() function which moves the mouse the specified distance. mouseXY( X, Y,)
Sleep 45 ; sleep for 45milliseconds
}
else  
break ;will stop the loop
}  
}  
}  
 
auto_fire2() ; Reduces recoil when ctrl is pressed
{
global _auto
if _auto  
{
Loop
{
if GetKeyState("LButton", "P") ; If LButton is pressed (And ctrl)
{  
 
Sleep 75 ; sleep for 85 milliseconds
mouseXY(0, 18) ;Call the mouseXY() function which moves the mouse the specified distance. mouseXY( X, Y,)
Sleep 45 ; sleep for 45milliseconds
}
else  
break  
}  
}  
}
 
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
}
 

 
Тут появляется другая проблема: горячие клавиши ~^LButton, ~LButton и !LButton повторяются 2 раза для Х1 и Х2. И программа считает это ошибкой. Когда оставляю только одну из боковых кнопок, то ошибок не выдает.  
(убираю эту часть:  
~^LButton::auto_fire2()
~LButton::autofire2()  
!LButton::_auto := ! _auto
)
Я не представляю как сделать, чтобы горячие клавиши все же могли повторяться в коде: АЛЬТ+ЛКМ, КТРЛ+ЛКМ, ЛКМ
Добавлено:
Сама идея же следующая:
Если я нажал кнопку 4 мышки, то при последующем нажатии ЛКМ и ее удержании происходит цикл задержка, сдвиг мышки. Как только отпускаю мышку, из цикла выхожу. Также для кнопки 5, только там будет иная задержка и сдвиг.
Пожалуй так.

Всего записей: 25 | Зарегистр. 12-03-2008 | Отправлено: 07:15 09-04-2014 | Исправлено: amigosxxx, 08:07 09-04-2014
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
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
    }
}

 
——————

Цитата:
Sleep 75 ; sleep for 85 milliseconds  

ну-ну

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 12:02 09-04-2014 | Исправлено: creature_ws, 12:12 09-04-2014
amigosxxx



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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  ; то выход
}  
 

 
Но опять же натыкаюсь на повтор Xbutton1:: и Xbutton2:: По всей видимости нужно ввести еще одно условие для понимания нажата ли кнопка ЛКМ с Ctrl или нет. И думаю его нужно внести в саму функцию Autofire.

Всего записей: 25 | Зарегистр. 12-03-2008 | Отправлено: 12:43 09-04-2014 | Исправлено: amigosxxx, 13:11 09-04-2014
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мне не понятно, что вам не понятно. Ваш стиль «тащить в код всё что вижу» не располагает продолжать диалог.

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 12:57 09-04-2014
amigosxxx



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ваш код мне ясен, но я не могу понять, как учесть действие КТРЛ+ЛКМ. В Вашем коде этого нет, вот я и советуюсь, как его добавить. Конечно можно запустить 2 скрипта - один отслеживает нажатие только ЛКМ, а другой КТРЛ+ЛКМ. Поменять нужно будет лишь кнопку в Autofire(20,-20, 200, "LButton") на Autofire(20,-20, 200, "^LButton")
Остальные условия я добавил как помощь, чтобы скрипт не работал в других окнх, чтобы можно было отключить саму функцию. Разве это плохо?

Всего записей: 25 | Зарегистр. 12-03-2008 | Отправлено: 13:22 09-04-2014 | Исправлено: amigosxxx, 13:24 09-04-2014
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Поменять нужно будет лишь кнопку в 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? или нажатие любой из этих кнопок должно предшествовать клику левой кнопки?
Видите как много вариантов
 
Чтобы решить задачу её сперва надо сформулировать.

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 13:30 09-04-2014 | Исправлено: creature_ws, 13:48 09-04-2014
amigosxxx



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ок.
Ща распишу с примерами. Думаю, и мне тогда станет ясно.  
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  
}  
}
 

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

Всего записей: 25 | Зарегистр. 12-03-2008 | Отправлено: 14:05 09-04-2014 | Исправлено: amigosxxx, 14:40 09-04-2014
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
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
    }
}

 
 

Цитата:
, если я отпущу КТРЛ. Должен бы перейти на режим стрельбы стоя,

Наверно нужно было упомянуть это сразу…

Код:
fireCorrectionMode := [[[-20, -20, 100], [20, 20, 100]], [[-20, 20, 100], [20, -20, 100]]]
 
F3::toggleHotkeys := !toggleHotkeys
 
#if toggleHotkeys
    ~Xbutton1::gunType := 1
    ~Xbutton2::gunType := 2
 
#if gunType && toggleHotkeys
    ~*LButton::
        Autofire()
        gunType := 0
        return
#if
 
Autofire() {
    global gunType, fireCorrectionMode
 
    while GetKeyState("LButton", "P") {
        mode := fireCorrectionMode[gunType, GetKeyState("LControl", "P")? 1 : 2]
        Click
        MouseMove mode[1], mode[2], 0, R
        Sleep mode[3]
    }
}
 

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 14:49 09-04-2014 | Исправлено: creature_ws, 15:22 09-04-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

Компьютерный форум Ru.Board » Компьютеры » Программы » AutoHotkey


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru