Что нового

[Мышь, клавиатура] Нужно увеличить функционал существующего автокликера

Perfix23

Новичок
Сообщения
19
Репутация
0
Версия AutoIt: 3.3.14.0

Описание: Нужно чтоб уже существующий автокликер, который при зажатии пкм имитирует много разовое нажатие этой клавиши, был обновлен из-за нехватки функционала. Необходимо чтобы кликер мог в окне при старте, по мимо уже существующих параметров, показывал еще 2, которые будут включатся/выключатся галочками, первый будет отвечать за работу или бездействие "кликанья" левой кнопки мыши, а второй. в свою очередь за правую.

Примечания: Пример: Я включаю программу, открывается окно, ставлю галочку на первом параметре, а на втором нет, в итоге автокликер должен работать как раньше только теперь с лкм. А если отмечены 2 параметра галочками, будет работать имитация многоразовых кликов на лкм и пкм при зажатии соответствующих клавиш.

Вот сам автокликер который нужно усовершенствовать:
Код:
#include <Misc.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

HotKeySet("{PAUSE}", "Start")
HotKeySet("+{ESC}", "Quit")

$GUI = GUICreate("Кликер", 455, 135)
$InpDownUp = GUICtrlCreateInput("", 5, 5, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", "5"))))
GUICtrlCreateLabel("задержка в миллисекундах между нажатием и отпусканием кнопки мыши", 60, 5, 380, 20, 0x0200)
$InpClicks = GUICtrlCreateInput("", 5, 30, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", "30"))))
GUICtrlCreateLabel("задержка в миллисекундах между одиночными кликами", 60, 30, 380, 20, 0x0200)
$InpFirst = GUICtrlCreateInput("", 5, 55, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", "100"))))
GUICtrlCreateLabel("задержка в миллисекундах после первого клика", 60, 55, 380, 20, 0x0200)
GUICtrlCreateLabel("Pause  -  установка/снятие кликера с паузы", 5, 85, 230, 20, 0x0200)
GUICtrlCreateLabel("Shift+ESC  -  прекращение работы скрипта", 5, 110, 230, 20, 0x0200)
$BtnStart = GUICtrlCreateButton("Готово", 350, 85, 100, 45)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $BtnStart
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", GUICtrlRead($InpDownUp))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", GUICtrlRead($InpClicks))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", GUICtrlRead($InpFirst))
      ExitLoop
  EndSwitch
Until 0

Global $DownUpDelay =  GUICtrlRead($InpDownUp)
Global $ClicksDelay = GUICtrlRead($InpClicks)
Global $FirstDelay = GUICtrlRead($InpFirst)
Global $Start = True
GUIDelete($GUI)

Do
  If $Start Then
    If _IsPressed("02") Then
      $Timer = TimerInit()
      Do
        If Not _IsPressed("02") Then ExitLoop
        Sleep(10)
      Until TimerDiff($Timer) > $FirstDelay
      If Not _IsPressed("02") Then
        ContinueLoop
      Else
        Do
          $tPoint = _WinAPI_GetMousePos()
          $hWin = _WinAPI_WindowFromPoint($tPoint)
          _WinAPI_ScreenToClient($hWin, $tPoint)
          RightDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
          Sleep($ClicksDelay)
        Until Not _IsPressed("02")
      EndIf
    EndIf
  EndIf
  Sleep(10)
Until 0

Func RightDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONUP))
EndFunc

Func Start()
  $Start = Not $Start
EndFunc

Func Quit()
  Exit
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Perfix23
Проверяйте.
Кнопки можно включать/выключать динамически во время работы скрипта: Shift+F1 - левая, Shift+F2 - правая.
Код:
#include <Misc.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

HotKeySet("{PAUSE}", "Start")
HotKeySet("+{ESC}", "Quit")

$GUI = GUICreate("Кликер", 455, 160)
$InpDownUp = GUICtrlCreateInput("", 5, 5, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", "5"))))
GUICtrlCreateLabel("задержка в миллисекундах между нажатием и отпусканием кнопки мыши", 60, 5, 380, 20, 0x0200)
$InpClicks = GUICtrlCreateInput("", 5, 30, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", "30"))))
GUICtrlCreateLabel("задержка в миллисекундах между одиночными кликами", 60, 30, 380, 20, 0x0200)
$InpFirst = GUICtrlCreateInput("", 5, 55, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", "100"))))
GUICtrlCreateLabel("задержка в миллисекундах после первого клика", 60, 55, 380, 20, 0x0200)
$LBtn = GUICtrlCreateCheckbox("Левая кнопка (Shift+F1)", 5, 85, 150, 20)
GUICtrlSetState(-1, IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", 4))
$RBtn = GUICtrlCreateCheckbox("Правая кнопка (Shift+F2)", 160, 85, 140, 20)
GUICtrlSetState(-1, IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", 4))
GUICtrlCreateLabel("Pause  -  установка/снятие кликера с паузы", 5, 115, 230, 20, 0x0200)
GUICtrlCreateLabel("Shift+ESC  -  прекращение работы скрипта", 5, 135, 230, 20, 0x0200)
$BtnStart = GUICtrlCreateButton("Готово", 350, 85, 100, 70)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $BtnStart
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", GUICtrlRead($InpDownUp))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", GUICtrlRead($InpClicks))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", GUICtrlRead($InpFirst))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", GUICtrlRead($LBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", GUICtrlRead($RBtn))
      ExitLoop
  EndSwitch
Until 0

Global $DownUpDelay =  GUICtrlRead($InpDownUp)
Global $ClicksDelay = GUICtrlRead($InpClicks)
Global $FirstDelay = GUICtrlRead($InpFirst)
Global $Left = GUICtrlRead($LBtn) = 1
Global $Right = GUICtrlRead($RBtn) = 1
Global $Start = True
GUIDelete($GUI)

HotKeySet("+{F1}", "LOnOff")
HotKeySet("+{F2}", "ROnOff")

Do
  If $Start Then
    If $Left Then Click("01")
    If $Right Then Click("02")
  EndIf
  Sleep(10)
Until 0

Func Click($Btn)
  If _IsPressed($Btn) Then
    $Timer = TimerInit()
    Do
      If Not _IsPressed($Btn) Then ExitLoop
      Sleep(10)
    Until TimerDiff($Timer) > $FirstDelay
    If Not _IsPressed($Btn) Then
      Return
    Else
      Do
        $tPoint = _WinAPI_GetMousePos()
        $hWin = _WinAPI_WindowFromPoint($tPoint)
        _WinAPI_ScreenToClient($hWin, $tPoint)
        Switch $Btn
          Case "01"
            LeftDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
          Case "02"
            RightDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
        EndSwitch
        Sleep($ClicksDelay)
      Until Not _IsPressed($Btn)
    EndIf
  EndIf
EndFunc

Func LeftDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
EndFunc

Func RightDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONUP))
EndFunc

Func Start()
  $Start = Not $Start
EndFunc

Func Quit()
  Exit
EndFunc

Func LOnOff()
  $Left = Not $Left
EndFunc

Func ROnOff()
  $Right = Not $Right
EndFunc
 
Автор
P

Perfix23

Новичок
Сообщения
19
Репутация
0
InnI сказал(а):
Проверяйте.
Кнопки можно включать/выключать динамически во время работы скрипта: Shift+F1 - левая, Shift+F2 - правая.
Все работает замечательно. Добавленная Вами функция включения/выключения кнопок пришлась как нельзя кстати. Я понимаю работа была проделана большая с этими лкм и пкм, но можно ли добавить еще одну настраиваемую клавишу в том же GUI для выполнения тех же функций что с лкм и пкм? Например: Я выставил в окне при запуске скрипта клавишу space, программа при зажимании пробела будет выдавать те же имитации многоразового нажатия пробела, т.е как и с лкм только другая регулируемая клавиша. Комбинация Shift+F3 могла бы включать/выключать "клацанье" этой клавиши. Возможно ли такое? :-\
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Perfix23
Пробуйте. Коды клавиш брать здесь. Все настройки задержек действуют и на клавишу.

Код:
#include <Misc.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

HotKeySet("{PAUSE}", "Start")
HotKeySet("+{ESC}", "Quit")

$GUI = GUICreate("Кликер", 455, 190)
$InpDownUp = GUICtrlCreateInput("", 5, 5, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", "5"))))
GUICtrlCreateLabel("задержка в миллисекундах между нажатием и отпусканием кнопки мыши", 60, 5, 380, 20, 0x0200)
$InpClicks = GUICtrlCreateInput("", 5, 30, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", "30"))))
GUICtrlCreateLabel("задержка в миллисекундах между одиночными кликами", 60, 30, 380, 20, 0x0200)
$InpFirst = GUICtrlCreateInput("", 5, 55, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", "100"))))
GUICtrlCreateLabel("задержка в миллисекундах после первого клика", 60, 55, 380, 20, 0x0200)
$InpLBtn = GUICtrlCreateCheckbox("Левая кнопка (Shift+F1)", 5, 85, 150, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", "4")))
$InpRBtn = GUICtrlCreateCheckbox("Правая кнопка (Shift+F2)", 160, 85, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", "4")))
$InpKey = GUICtrlCreateCheckbox("Код клавиши (Shift+F3)", 5, 115, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", "4")))
$InpCode = GUICtrlCreateInput("", 160, 115, 25, 20)
GUICtrlSetLimit(-1, 2)
GUICtrlSetData(-1, IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", "20"))
GUICtrlCreateLabel("Pause  -  установка/снятие кликера с паузы", 5, 145, 230, 20, 0x0200)
GUICtrlCreateLabel("Shift+ESC  -  прекращение работы скрипта", 5, 165, 230, 20, 0x0200)
$BtnStart = GUICtrlCreateButton("Готово", 350, 85, 100, 100)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $BtnStart
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", GUICtrlRead($InpDownUp))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", GUICtrlRead($InpClicks))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", GUICtrlRead($InpFirst))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", GUICtrlRead($InpLBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", GUICtrlRead($InpRBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", GUICtrlRead($InpKey))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", GUICtrlRead($InpCode))
      ExitLoop
  EndSwitch
Until 0

Global $DownUpDelay =  GUICtrlRead($InpDownUp)
Global $ClicksDelay = GUICtrlRead($InpClicks)
Global $FirstDelay = GUICtrlRead($InpFirst)
Global $Left = GUICtrlRead($InpLBtn) = 1
Global $Right = GUICtrlRead($InpRBtn) = 1
Global $Key = GUICtrlRead($InpKey) = 1
Global $Code = GUICtrlRead($InpCode)
Global $Start = True
GUIDelete($GUI)

HotKeySet("+{F1}", "LOnOff")
HotKeySet("+{F2}", "ROnOff")
HotKeySet("+{F3}", "KOnOff")

Do
  If $Start Then
    If $Left Then ClickPress("01")
    If $Right Then ClickPress("02")
    If $Key Then ClickPress($Code)
  EndIf
  Sleep(10)
Until 0

Func ClickPress($Btn)
  If _IsPressed($Btn) Then
    $Timer = TimerInit()
    Do
      If Not _IsPressed($Btn) Then ExitLoop
      Sleep(10)
    Until TimerDiff($Timer) > $FirstDelay
    If Not _IsPressed($Btn) Then
      Return
    Else
      Switch $Btn
        Case "01", "02"
          Do
            $tPoint = _WinAPI_GetMousePos()
            $hWin = _WinAPI_WindowFromPoint($tPoint)
            _WinAPI_ScreenToClient($hWin, $tPoint)
            Switch $Btn
              Case "01"
                LeftDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
              Case "02"
                RightDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
            EndSwitch
            Sleep($ClicksDelay)
          Until Not _IsPressed($Btn)
        Case Else
          Do
            _WinAPI_Keybd_Event("0x" & $Btn, 0)
            Sleep($DownUpDelay)
            _WinAPI_Keybd_Event("0x" & $Btn, 2)
            Sleep($ClicksDelay)
          Until Not _IsPressed($Btn)
      EndSwitch
    EndIf
  EndIf
EndFunc

Func LeftDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
EndFunc

Func RightDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONUP))
EndFunc

Func Start()
  $Start = Not $Start
EndFunc

Func Quit()
  Exit
EndFunc

Func LOnOff()
  $Left = Not $Left
EndFunc

Func ROnOff()
  $Right = Not $Right
EndFunc

Func KOnOff()
  $Key = Not $Key
EndFunc
 
Автор
P

Perfix23

Новичок
Сообщения
19
Репутация
0
InnI сказал(а):
Perfix23
Пробуйте. Коды клавиш брать здесь. Все настройки задержек действуют и на клавишу.
Прошу прощения за постоянно дополняющийся список требуемых функций, но последнее о чем Я попрошу это добавление функции, которая будет зажимать клавишу соответствующей комбинацией. Т.е. Я нажму, например, alt+F1 и скрипт будет выдавать сигнал зажатой лкм до тех пор пока эта же комбинация клавиш не будет нажата. Соответственно alt+F2 будет отвечать за зажатие/отжатие пкм, а alt+F3 за ту клавишу которую Я выбиру при запуске скрипта. Еще раз раз извиняюсь. :-[
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Perfix23
Только в клавишах не запутайтесь
Код:
#include <Misc.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

HotKeySet("{PAUSE}", "Start")
HotKeySet("+{ESC}", "Quit")

$GUI = GUICreate("Кликер", 455, 190)
$InpDownUp = GUICtrlCreateInput("", 5, 5, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", "5"))))
GUICtrlCreateLabel("задержка в миллисекундах между нажатием и отпусканием кнопки мыши", 60, 5, 380, 20, 0x0200)
$InpClicks = GUICtrlCreateInput("", 5, 30, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", "30"))))
GUICtrlCreateLabel("задержка в миллисекундах между одиночными кликами", 60, 30, 380, 20, 0x0200)
$InpFirst = GUICtrlCreateInput("", 5, 55, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", "100"))))
GUICtrlCreateLabel("задержка в миллисекундах после первого клика", 60, 55, 380, 20, 0x0200)
$InpLBtn = GUICtrlCreateCheckbox("Левая кнопка (Shift+F1)", 5, 85, 150, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", "4")))
$InpRBtn = GUICtrlCreateCheckbox("Правая кнопка (Shift+F2)", 160, 85, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", "4")))
$InpKey = GUICtrlCreateCheckbox("Код клавиши (Shift+F3)", 5, 115, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", "4")))
$InpCode = GUICtrlCreateInput("", 160, 115, 25, 20)
GUICtrlSetLimit(-1, 2)
GUICtrlSetData(-1, IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", "20"))
GUICtrlCreateLabel("Pause  -  установка/снятие кликера с паузы", 5, 145, 230, 20, 0x0200)
GUICtrlCreateLabel("Shift+ESC  -  прекращение работы скрипта", 5, 165, 230, 20, 0x0200)
$BtnStart = GUICtrlCreateButton("Готово", 350, 85, 100, 100)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $BtnStart
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", GUICtrlRead($InpDownUp))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", GUICtrlRead($InpClicks))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", GUICtrlRead($InpFirst))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", GUICtrlRead($InpLBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", GUICtrlRead($InpRBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", GUICtrlRead($InpKey))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", GUICtrlRead($InpCode))
      ExitLoop
  EndSwitch
Until 0

Global $DownUpDelay =  GUICtrlRead($InpDownUp)
Global $ClicksDelay = GUICtrlRead($InpClicks)
Global $FirstDelay = GUICtrlRead($InpFirst)
Global $Left = GUICtrlRead($InpLBtn) = 1
Global $Right = GUICtrlRead($InpRBtn) = 1
Global $Key = GUICtrlRead($InpKey) = 1
Global $Code = GUICtrlRead($InpCode)
Global $Start = True
Global $Llock = False
Global $Rlock = False
Global $Klock = False
GUIDelete($GUI)

HotKeySet("+{F1}", "LOnOff")
HotKeySet("+{F2}", "ROnOff")
HotKeySet("+{F3}", "KOnOff")
HotKeySet("!{F1}", "Llock")
HotKeySet("!{F2}", "Rlock")
HotKeySet("!{F3}", "Klock")

Do
  If $Start Then
    If $Left Then ClickPress("01")
    If $Right Then ClickPress("02")
    If $Key Then ClickPress($Code)
  EndIf
  Sleep(10)
Until 0

Func ClickPress($Btn)
  If _IsPressed($Btn) Then
    $Timer = TimerInit()
    Do
      If Not _IsPressed($Btn) Then ExitLoop
      Sleep(10)
    Until TimerDiff($Timer) > $FirstDelay
    If Not _IsPressed($Btn) Then
      Return
    Else
      Switch $Btn
        Case "01", "02"
          Do
            $tPoint = _WinAPI_GetMousePos()
            $hWin = _WinAPI_WindowFromPoint($tPoint)
            _WinAPI_ScreenToClient($hWin, $tPoint)
            Switch $Btn
              Case "01"
                LeftDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
              Case "02"
                RightDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
            EndSwitch
            Sleep($ClicksDelay)
          Until Not _IsPressed($Btn)
        Case Else
          Do
            _WinAPI_Keybd_Event("0x" & $Btn, 0)
            Sleep($DownUpDelay)
            _WinAPI_Keybd_Event("0x" & $Btn, 2)
            Sleep($ClicksDelay)
          Until Not _IsPressed($Btn)
          If $Klock Then _WinAPI_Keybd_Event("0x" & $Btn, 0)
      EndSwitch
    EndIf
  EndIf
EndFunc

Func LeftDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
EndFunc

Func RightDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONUP))
EndFunc

Func Start()
  $Start = Not $Start
EndFunc

Func Quit()
  Exit
EndFunc

Func LOnOff()
  $Left = Not $Left
EndFunc

Func ROnOff()
  $Right = Not $Right
EndFunc

Func KOnOff()
  $Key = Not $Key
EndFunc

Func Llock()
  $Llock = Not $Llock
  If $Llock Then
    MouseDown("left")
  Else
    MouseUp("left")
  EndIf
EndFunc

Func Rlock()
  $Rlock = Not $Rlock
  If $Rlock Then
    MouseDown("right")
  Else
    MouseUp("right")
  EndIf
EndFunc

Func Klock()
  $Klock = Not $Klock
  If $Klock Then
    _WinAPI_Keybd_Event("0x" & $Code, 0)
  Else
    _WinAPI_Keybd_Event("0x" & $Code, 2)
  EndIf
EndFunc
 
Автор
P

Perfix23

Новичок
Сообщения
19
Репутация
0
InnI сказал(а):
Perfix23
Только в клавишах не запутайтесь
Протестировал, первое что хотел отметить, Я не удачную кнопку выбрал. Можно вместо всех alt-ов поставить ctrl? Есть пару неувязочек, при включенном моде "клацанья" на лкм и пкм нельзя включить мод зажатия тех же клавиш, а "клавиша пробел" (это та клавиша что при старте скрипта выбирается, чтоб было проще буду в кавычки выделять) напротив работает только с включенный модом "клацанья" постоянно клацает тот пробел без моего участия. Можно вообще сделать чтоб мод зажатия был только включающимся, т.е Я нажимаю ctrl+F1 и лкм зажалась и при повторном нажатии ctrl+F1 лкм тоже зажмется, поскольку мод зажатия отключается нажатием той же клавиши, выключение мода зажатия на комбинациях c сtrl не нужно. В итоге должно получится нечто такое (Я разберу с примером левой кнопки мыши, а относится это и к пкм и к "клавише пробел"): при включенном моде "клацанья" лкм, комбинация ctrl+F1 зажмет лкм и будет клацать как-будто Я зажал левую кнопку на мышке пальцем, а при выключенном моде "клацанья" лкм, комбинация ctrl+F1 просто зажмет лкм, а отожмется лкм когда Я нажму лкм. Наверно мною написанный бред не получится понять или невозможно сделать :D
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Perfix23
Можно вместо всех alt-ов поставить ctrl?
Можно. Ставьте, разрешаю.

при включенном моде "клацанья" на лкм и пкм нельзя включить мод зажатия тех же клавиш
Естественно, т.к. "зажатие" обрабатывается в собственном цикле, а "клацанье" было добавлено позже "поверх". Разруливать взаимную блокировку я точно не буду. Это надо было делать сразу - структура скрипта была бы другая.

нельзя понять или невозможно сделать
Лично я запутался и в кнопках и в терминах. Сделать описанное можно, но нужно написать скрипт заново. А мне, честно говоря, это уже не интересно.


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

Perfix23
комбинация ctrl+F1 просто зажмет лкм, а отожмется лкм когда Я нажму лкм
Вообще-то, ваша задумка трудоёмка в реализации, т.к. очень сложно отличить реальный клик от имитации.
Предлагаю вариант без мыши: Ctrl+F1 включает/выключает клацанье левой кнопкой, Ctrl+F2 - правой, Ctrl+F3 - пробелом.
Можете попробовать запустить этот скрипт одновременно со скриптом из ответа #3 и посмотреть, что будет
Код:
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

HotKeySet("{PAUSE}", "Start")
HotKeySet("+{ESC}", "Quit")

$GUI = GUICreate("Кликер", 355, 160)
$InpDownUp = GUICtrlCreateInput("", 5, 5, 50, 20, 0x2000)
GUICtrlSetData(-1, IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", "5"))
GUICtrlCreateLabel("мс - задержка между нажатием и отпусканием кнопки", 60, 5, 290, 20, 0x0200)
$InpClicks = GUICtrlCreateInput("", 5, 30, 50, 20, 0x2000)
GUICtrlSetData(-1, IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", "30"))
GUICtrlCreateLabel("мс - задержка между одиночными кликами", 60, 30, 290, 20, 0x0200)
GUICtrlCreateLabel("Ctrl+F1 - левая кнопка мыши", 5, 55, 230, 20, 0x0200)
GUICtrlCreateLabel("Ctrl+F2 - правая кнопка мыши", 5, 75, 230, 20, 0x0200)
GUICtrlCreateLabel("Ctrl+F3 - клавиша 'пробел'", 5, 95, 230, 20, 0x0200)
GUICtrlCreateLabel("Pause  -  установка/снятие кликера с паузы", 5, 115, 230, 20, 0x0200)
GUICtrlCreateLabel("Shift+ESC  -  прекращение работы скрипта", 5, 135, 230, 20, 0x0200)
$BtnStart = GUICtrlCreateButton("Готово", 250, 55, 100, 100)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $BtnStart
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", GUICtrlRead($InpDownUp))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", GUICtrlRead($InpClicks))
      ExitLoop
  EndSwitch
Until 0

Global $DownUpDelay =  GUICtrlRead($InpDownUp)
Global $ClicksDelay = GUICtrlRead($InpClicks)
Global $Left, $Right, $Space, $Start = True
GUIDelete($GUI)

HotKeySet("^{F1}", "LOnOff")
HotKeySet("^{F2}", "ROnOff")
HotKeySet("^{F3}", "SOnOff")

While Sleep(10)
  If $Start Then
    If $Left Then ClickPress("01")
    If $Right Then ClickPress("02")
    If $Space Then ClickPress("20")
  EndIf
WEnd

Func ClickPress($Btn)
  Switch $Btn
    Case "01", "02"
      $tPoint = _WinAPI_GetMousePos()
      $hWin = _WinAPI_WindowFromPoint($tPoint)
      _WinAPI_ScreenToClient($hWin, $tPoint)
      Switch $Btn
        Case "01"
          LeftDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
        Case "02"
          RightDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
      EndSwitch
    Case Else
      _WinAPI_Keybd_Event("0x" & $Btn, 0)
      Sleep($DownUpDelay)
      _WinAPI_Keybd_Event("0x" & $Btn, 2)
  EndSwitch
  Sleep($ClicksDelay)
EndFunc

Func LeftDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
EndFunc

Func RightDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONUP))
EndFunc

Func Start()
  $Start = Not $Start
EndFunc

Func Quit()
  Exit
EndFunc

Func LOnOff()
  $Left = Not $Left
EndFunc

Func ROnOff()
  $Right = Not $Right
EndFunc

Func SOnOff()
  $Space = Not $Space
EndFunc
 
Автор
P

Perfix23

Новичок
Сообщения
19
Репутация
0
InnI сказал(а):
Сделать описанное можно, но нужно написать скрипт заново. А мне, честно говоря, это уже не интересно.
Извините меня и мою широко раскатанную губу. Была проделана огромная работа и Я глубоко благодарен за Ваши старания и стремление помочь. Я уважаю Ваш труд, а моя наглость погубила весь энтузиазм.
Полагаю забрать свои слова назад уже не получится, и просить больше Я не имею права, но все же, дабы закончить начатое попрошу. Разумеется, ни а каком новом скрипте не может быть и речи. Не могли бы Вы внести 2 изменения в самую последнюю версию скрипта, 1: с той кнопкой, которая пробел, не работает мод зажатия и 2: с комбинациями alt+F1 alt+F2 alt+F3 убрать возможность выключения мода зажатия, пусть этим комбинации только включают этот мод.
Ни на чем не настаиваю и ничего не навязываю. Уповаю на Вашу милость и буду ждать сколько потребуется.
Я приму от Вас простой ответ "нет", после него поставлю "Тема решена" и больше никогда не посмею о чем-либо просить. ???
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Perfix23
В предыдущем моём сообщении (ответ #7) добавлен скрипт без мыши. Вы его пробовали? Он вам не подходит?
 
Автор
P

Perfix23

Новичок
Сообщения
19
Репутация
0
InnI сказал(а):
Perfix23
В предыдущем моём сообщении (ответ #7) добавлен скрипт без мыши. Вы его пробовали? Он вам не подходит?
Начал тестировать версию без мыши + ответ #3 вышло не очень, попробовал версию без мыши + ответ #5, начало работать все отлично, именно так, как Я описывал. Но после всех этих тестов выключил версию без мыши оставив ответ #5, не понимаю в чем дело, но работа скрипта осталась такой же. Т.е. Вы уже создали то, что описали как:
Ваша задумка трудоёмка в реализации. Сделать описанное можно, но нужно написать скрипт заново.
Не пойму, ответ #5 стал корректно работать после всех этих манипуляций или эта версия все время была рабочей, а какая-то моя оплошность при первом тесте не дала мне это понять. :stars:
Таким образом, ответ #5 имеет только 3 небольших недочета, исправив их Вы создадите абсолютно идеальную программу.
1: Все комбинации alt заменить на ctrl;
2: С комбинациями ctrl+F1 ctrl+F2 ctrl+F3 убрать возможность выключения мода зажатия, пусть эти комбинации только включают мод;
3: С кнопкой пробел, не работает мод зажатия. Я так понял, что самое сложное, но если это не удастся исправить, то просто уберите комбинацию ctrl+F3.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Perfix23
По причине невозможности отличить реальный клик от имитации пришлось отказаться от задержки первого клика, т.е. клацанье начинается сразу при нажатии кнопки/клавиши. Опции включения клавиш в главном окне (или при помощи Shift+F_) имеют приоритет, т.е. если кнопка/клавиша отключена, то и зажатие её через Ctrl+F_ работать не будет. Все режимы включаются/выключаются динамически через Shift+F_ или Ctrl+F_
Код:
#include <Misc.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

HotKeySet("{PAUSE}", "Start")
HotKeySet("+{ESC}", "Quit")

$GUI = GUICreate("Кликер", 455, 155)
$InpDownUp = GUICtrlCreateInput("", 5, 5, 50, 20, 0x2000)
GUICtrlSetData(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", "5")))
GUICtrlCreateLabel("задержка в миллисекундах между нажатием и отпусканием кнопки мыши", 60, 5, 380, 20, 0x0200)
$InpClicks = GUICtrlCreateInput("", 5, 30, 50, 20, 0x2000)
GUICtrlSetData(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", "30")))
GUICtrlCreateLabel("задержка в миллисекундах между одиночными кликами", 60, 30, 380, 20, 0x0200)
$InpLBtn = GUICtrlCreateCheckbox("Левая кнопка (Shift+F1)", 5, 60, 150, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", "4")))
$InpRBtn = GUICtrlCreateCheckbox("Правая кнопка (Shift+F2)", 160, 60, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", "4")))
$InpKey = GUICtrlCreateCheckbox("Код клавиши (Shift+F3)", 5, 85, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", "4")))
$InpCode = GUICtrlCreateInput("", 160, 85, 25, 20)
GUICtrlSetLimit(-1, 2)
GUICtrlSetData(-1, IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", "20"))
GUICtrlCreateLabel("Pause  -  установка/снятие кликера с паузы", 5, 110, 230, 20, 0x0200)
GUICtrlCreateLabel("Shift+ESC  -  прекращение работы скрипта", 5, 130, 230, 20, 0x0200)
$BtnStart = GUICtrlCreateButton("Готово", 350, 60, 100, 90)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $BtnStart
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", GUICtrlRead($InpDownUp))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", GUICtrlRead($InpClicks))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", GUICtrlRead($InpLBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", GUICtrlRead($InpRBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", GUICtrlRead($InpKey))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", GUICtrlRead($InpCode))
      ExitLoop
  EndSwitch
Until 0

Global $DownUpDelay =  GUICtrlRead($InpDownUp)
Global $ClicksDelay = GUICtrlRead($InpClicks)
Global $Left = GUICtrlRead($InpLBtn) = 1
Global $Right = GUICtrlRead($InpRBtn) = 1
Global $Key = GUICtrlRead($InpKey) = 1
Global $Code = GUICtrlRead($InpCode)
Global $Llock, $Rlock, $Klock, $Start = True
GUIDelete($GUI)

HotKeySet("+{F1}", "LOnOff")
HotKeySet("+{F2}", "ROnOff")
HotKeySet("+{F3}", "KOnOff")
HotKeySet("^{F1}", "Llock")
HotKeySet("^{F2}", "Rlock")
HotKeySet("^{F3}", "Klock")

While Sleep(10)
  If $Start Then
    If $Left Then ClickPress("01")
    If $Right Then ClickPress("02")
    If $Key Then ClickPress($Code)
  EndIf
WEnd

Func ClickPress($Btn)
  Local $tPoint = _WinAPI_GetMousePos()
  Local $hWin = _WinAPI_WindowFromPoint($tPoint)
  _WinAPI_ScreenToClient($hWin, $tPoint)
  Switch $Btn
    Case "01"
      If $Llock Or _IsPressed("01") Then LeftDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
    Case "02"
      If $Rlock Or _IsPressed("02") Then RightDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
    Case Else
      If $Klock Or _IsPressed($Btn) Then KeyPress($Btn)
  EndSwitch
  Sleep($ClicksDelay)
EndFunc

Func LeftDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
EndFunc

Func RightDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONUP))
EndFunc

Func KeyPress($Code)
  _WinAPI_Keybd_Event("0x" & $Code, 0)
  Sleep($DownUpDelay)
  _WinAPI_Keybd_Event("0x" & $Code, 2)
EndFunc

Func Start()
  $Start = Not $Start
EndFunc

Func Quit()
  Exit
EndFunc

Func LOnOff()
  $Left = Not $Left
EndFunc

Func ROnOff()
  $Right = Not $Right
EndFunc

Func KOnOff()
  $Key = Not $Key
EndFunc

Func Llock()
  $Llock = Not $Llock
EndFunc

Func Rlock()
  $Rlock = Not $Rlock
EndFunc

Func Klock()
  $Klock = Not $Klock
EndFunc
 
Автор
P

Perfix23

Новичок
Сообщения
19
Репутация
0
InnI сказал(а):
Perfix23
По причине невозможности отличить реальный клик от имитации пришлось отказаться от задержки первого клика.
Я не понимаю, зачем отказываться от задержки, почему если кнопка/клавиша отключена, то и зажатие её через Ctrl+F_ работать не будет, а если отличить реальный клик от имитации невозможно, то почему созданный Вами скрипт все это может и ни в чем себе не отказывает? :smile:

Код:
#include <Misc.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

HotKeySet("{PAUSE}", "Start")
HotKeySet("+{ESC}", "Quit")

$GUI = GUICreate("Кликер", 455, 190)
$InpDownUp = GUICtrlCreateInput("", 5, 5, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", "5"))))
GUICtrlCreateLabel("задержка в миллисекундах между нажатием и отпусканием кнопки мыши", 60, 5, 380, 20, 0x0200)
$InpClicks = GUICtrlCreateInput("", 5, 30, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", "30"))))
GUICtrlCreateLabel("задержка в миллисекундах между одиночными кликами", 60, 30, 380, 20, 0x0200)
$InpFirst = GUICtrlCreateInput("", 5, 55, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", "100"))))
GUICtrlCreateLabel("задержка в миллисекундах после первого клика", 60, 55, 380, 20, 0x0200)
$InpLBtn = GUICtrlCreateCheckbox("Левая кнопка (Shift+F1)", 5, 85, 150, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", "4")))
$InpRBtn = GUICtrlCreateCheckbox("Правая кнопка (Shift+F2)", 160, 85, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", "4")))
$InpKey = GUICtrlCreateCheckbox("Код клавиши (Shift+F3)", 5, 115, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", "4")))
$InpCode = GUICtrlCreateInput("", 160, 115, 25, 20)
GUICtrlSetLimit(-1, 2)
GUICtrlSetData(-1, IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", "20"))
GUICtrlCreateLabel("Pause  -  установка/снятие кликера с паузы", 5, 145, 230, 20, 0x0200)
GUICtrlCreateLabel("Shift+ESC  -  прекращение работы скрипта", 5, 165, 230, 20, 0x0200)
$BtnStart = GUICtrlCreateButton("Готово", 350, 85, 100, 100)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $BtnStart
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", GUICtrlRead($InpDownUp))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", GUICtrlRead($InpClicks))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", GUICtrlRead($InpFirst))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", GUICtrlRead($InpLBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", GUICtrlRead($InpRBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", GUICtrlRead($InpKey))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", GUICtrlRead($InpCode))
      ExitLoop
  EndSwitch
Until 0

Global $DownUpDelay =  GUICtrlRead($InpDownUp)
Global $ClicksDelay = GUICtrlRead($InpClicks)
Global $FirstDelay = GUICtrlRead($InpFirst)
Global $Left = GUICtrlRead($InpLBtn) = 1
Global $Right = GUICtrlRead($InpRBtn) = 1
Global $Key = GUICtrlRead($InpKey) = 1
Global $Code = GUICtrlRead($InpCode)
Global $Start = True
Global $Llock = False
Global $Rlock = False
Global $Klock = False
GUIDelete($GUI)

HotKeySet("+{F1}", "LOnOff")
HotKeySet("+{F2}", "ROnOff")
HotKeySet("+{F3}", "KOnOff")
HotKeySet("!{F1}", "Llock")
HotKeySet("!{F2}", "Rlock")
HotKeySet("!{F3}", "Klock")

Do
  If $Start Then
    If $Left Then ClickPress("01")
    If $Right Then ClickPress("02")
    If $Key Then ClickPress($Code)
  EndIf
  Sleep(10)
Until 0

Func ClickPress($Btn)
  If _IsPressed($Btn) Then
    $Timer = TimerInit()
    Do
      If Not _IsPressed($Btn) Then ExitLoop
      Sleep(10)
    Until TimerDiff($Timer) > $FirstDelay
    If Not _IsPressed($Btn) Then
      Return
    Else
      Switch $Btn
        Case "01", "02"
          Do
            $tPoint = _WinAPI_GetMousePos()
            $hWin = _WinAPI_WindowFromPoint($tPoint)
            _WinAPI_ScreenToClient($hWin, $tPoint)
            Switch $Btn
              Case "01"
                LeftDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
              Case "02"
                RightDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
            EndSwitch
            Sleep($ClicksDelay)
          Until Not _IsPressed($Btn)
        Case Else
          Do
            _WinAPI_Keybd_Event("0x" & $Btn, 0)
            Sleep($DownUpDelay)
            _WinAPI_Keybd_Event("0x" & $Btn, 2)
            Sleep($ClicksDelay)
          Until Not _IsPressed($Btn)
          If $Klock Then _WinAPI_Keybd_Event("0x" & $Btn, 0)
      EndSwitch
    EndIf
  EndIf
EndFunc

Func LeftDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
EndFunc

Func RightDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONUP))
EndFunc

Func Start()
  $Start = Not $Start
EndFunc

Func Quit()
  Exit
EndFunc

Func LOnOff()
  $Left = Not $Left
EndFunc

Func ROnOff()
  $Right = Not $Right
EndFunc

Func KOnOff()
  $Key = Not $Key
EndFunc

Func Llock()
  $Llock = Not $Llock
  If $Llock Then
    MouseDown("left")
  Else
    MouseUp("left")
  EndIf
EndFunc

Func Rlock()
  $Rlock = Not $Rlock
  If $Rlock Then
    MouseDown("right")
  Else
    MouseUp("right")
  EndIf
EndFunc

Func Klock()
  $Klock = Not $Klock
  If $Klock Then
    _WinAPI_Keybd_Event("0x" & $Code, 0)
  Else
    _WinAPI_Keybd_Event("0x" & $Code, 2)
  EndIf
EndFunc
Этот скрипт работает идеально, за исключением 3-х недочетов:
1: Все комбинации alt+F_ заменить на ctrl+F_;
2: У комбинаций ctrl+F_ убрать возможность выключения мода зажатия, пусть эти комбинации только включают мод (сейчас если нажать ctrl+F_ скрипт включит мод зажатия для соответствующей кнопки, при повторном нажатии этой комбинации скрипт выключит мод зажатия, сделайте пожалуйста, чтоб каждое использование ctrl+F_ только включало мод зажатия);
3: С кнопкой пробел, не работает мод зажатия. Я так понял, что самое сложное, но если это не удастся исправить, то бог с ним, оставьте как
есть.
По возможности исправьте сколько получится пунктов. Я буду чрезмерно благодарен и перестану морочить Вам голову :-[
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
InnI [?]
По причине невозможности отличить реальный клик от имитации
Можно так:

(при зажатой ЛКМ происходит эмуляция ее нажатий)
Код:
#Include "UI.au3"

Global $g_bFlag = False

OnAutoItExitRegister('__OnExit')
__FEng_UI_Startup()

_FEng_UI_TrigAdd(0, 0, @DesktopWidth, @DesktopHeight, '__CallBack', True)
_FEng_UI_AllowInput()

While Sleep(1000)
	If $g_bFlag Then _
		MouseClick("left")
WEnd

; =================
Func __CallBack($iTrig, $iMsg, ByRef $tMSLLHOOK, ByRef $vExtra)
	Switch $iMsg
		Case 0x0201, 0x0202
			If Not BitAnd($tMSLLHOOK.flags, 1) Then ;Если действие - не эмуляция
				$g_bFlag = ($iMsg = 0x0201)
				Return 1
			EndIf
	EndSwitch
EndFunc

Func __OnExit()
    __FEng_UI_Shutdown()
EndFunc


UI.au3
Код:
#cs ----------------------------------------------------------------------------

 File Ver .....: 03.04.15
 Engine Ver ...: 2.0.0
 AutoIt Ver ...: 3.3.12.0
 Author .......: Firex

#ce ----------------------------------------------------------------------------

; FEngin: UI []

Global _ ;[0]: [0] - Count, [1] -
	$__FE_UI_aTrig[99][7] = [[0]], _
	$__FE_UI_CbMouse, _
	$__FE_UI_hMouseHook, _
	$__FE_UI_InputCount

Global Const $tagMSLLHOOK = 'long X; long Y; dword mouseData; dword flags; dword time; ulong_ptr dwExtraInfo'
; ##############################################################

#Include <WinAPIEx.au3>
;#Include "UI\_Menu_v1.au3"


; #FUNCTION# ;===============================================================================
; Name...........: _FEng_UI_TrigAdd
; Description ...:
; Remarks .......:
; ;==========================================================================================
Func _FEng_UI_TrigAdd($x, $y, $w, $h, $CallBack, $fState = 0, $vExtra = 0)
	Local $Id, $Num = $__FE_UI_aTrig[0][0]
	; ---
	If $Num Then
		For $Id = $Num To 1 Step -1
			If $__FE_UI_aTrig[$Id][0] == '' Then _
				ExitLoop
		Next
	EndIf
	If Not $Id Then
		$Id = $Num + 1
		If $Id > ( UBound( $__FE_UI_aTrig ) - 1 ) Then _
			Return 0

		$__FE_UI_aTrig[0][0] = $Id
	EndIf

	$__FE_UI_aTrig[$Id][0] = Int( $fState )
	_FEng_UI_TrigPosSet($Id, $x, $y, $w, $h)

	$__FE_UI_aTrig[$Id][5] = $CallBack
	$__FE_UI_aTrig[$Id][6] = $vExtra
	; ---
	Return $Id
EndFunc

; #FUNCTION# ;===============================================================================
; Name...........: _FEng_UI_TrigEnable
; Description ...:
; Remarks .......:
; ;==========================================================================================
Func _FEng_UI_TrigEnable($Id, $fEnable = 1)
	If $Id > 0 Then
		$__FE_UI_aTrig[$Id][0] = Int( $fEnable )
	EndIf
EndFunc

; #FUNCTION# ;===============================================================================
; Name...........: _FEng_UI_TrigPosSet
; Description ...:
; Remarks .......:
; ;==========================================================================================
Func _FEng_UI_TrigPosSet($Id, $x, $y, $w , $h)
	If $Id > 0 Then
		$__FE_UI_aTrig[$Id][1] = $x
		$__FE_UI_aTrig[$Id][2] = $y
		$__FE_UI_aTrig[$Id][3] = $x + $w
		$__FE_UI_aTrig[$Id][4] = $y + $h
	EndIf
EndFunc

; #FUNCTION# ;===============================================================================
; Name...........: _FEng_UI_TrigDelete
; Description ...:
; Remarks .......:
; ;==========================================================================================
Func _FEng_UI_TrigDelete($Id)
	If $Id > 0 Then
		$__FE_UI_aTrig[$Id][0] = ''
		$__FE_UI_aTrig[$Id][6] = 0
	EndIf
EndFunc

; #FUNCTION# ;===============================================================================
; Name...........: _FEng_UI_AllowInput
; Description ...:
; Remarks .......:
; ;==========================================================================================
Func _FEng_UI_AllowInput($fState = 1)
	If $fState Then
		If Not $__FE_UI_InputCount Then
			Local $hModule
			; ---
			$hModule = _WinAPI_GetModuleHandle(0)
			$__FE_UI_hMouseHook = _WinAPI_SetWindowsHookEx( _
				$WH_MOUSE_LL, _
				DllCallbackGetPtr( $__FE_UI_CbMouse ), _
				$hModule _
			)
			Return ( $__FE_UI_hMouseHook <> 0 )
		EndIf
		; *
		$__FE_UI_InputCount += 1
	Else
		If $__FE_UI_InputCount == 1 Then
			_WinAPI_UnhookWindowsHookEx( $__FE_UI_hMouseHook )
			$__FE_UI_hMouseHook = 0
		ElseIf Not $__FE_UI_InputCount Then
			; -
			Return False
		EndIf
		; *
		$__FE_UI_hMouseHook -= 1
	EndIf
	; -
	Return True
EndFunc



; ==============================================================
; ### Internals
; ==============================================================
Func __FEng_UI_Startup()
	$__FE_UI_CbMouse = DllCallbackRegister("__UI_MouseHandler", "int", "int;ptr;ptr")
EndFunc

Func __FEng_UI_Shutdown()
	$__FE_UI_InputCount = 1
	If $__FE_UI_hMouseHook Then _
		_FEng_UI_AllowInput(0)

	DllCallbackFree( $__FE_UI_CbMouse )
EndFunc

Func __UI_MouseHandler($iCode, $wParam, $lParam)
	Local $Ret = _WinAPI_CallNextHookEx( $__FE_UI_hMouseHook, $iCode, $wParam, $lParam )
	; -
	If $iCode = 0 Then ;HC_ACTION
		Local $tMSLLHOOK = DllStructCreate( $tagMSLLHOOK, $lParam ) ;Not completed...
		; ---
		For $Id = 1 To $__FE_UI_aTrig[0][0] Step 1
			If $__FE_UI_aTrig[$Id][0] And _
				$tMSLLHOOK.X >= $__FE_UI_aTrig[$Id][1] And $tMSLLHOOK.X <= $__FE_UI_aTrig[$Id][3] And _
				$tMSLLHOOK.Y >= $__FE_UI_aTrig[$Id][2] And $tMSLLHOOK.Y <= $__FE_UI_aTrig[$Id][4] _
			Then
				If $__FE_UI_aTrig[$Id][5] Then _
					Return Call( $__FE_UI_aTrig[$Id][5], _
						$Id, _
						$wParam, _
						$tMSLLHOOK, _
						$__FE_UI_aTrig[$Id][6] _ ;Extra info
					)
				; *
				ExitLoop
			EndIf
		Next
	EndIf
	; ---
	Return $Ret
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
firex,
Определяет только MouseClick(), на функцию LeftDownUp() не реагирует.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
firex
Сложновато для меня. Попробую разобраться.


Perfix23
почему если кнопка/клавиша отключена, то и зажатие её через Ctrl+F_ работать не будет
Потому что вы изначально хотели, чтобы кнопка/клавиша "клацала" только, если установлена "галочка". А то, что зажатие через Ctrl+F_ должно работать независимо от этих "галочек", вы нигде не уточняли.

при повторном нажатии этой комбинации скрипт выключит мод зажатия
Так зачем вы повторно нажимаете?! Не нужно выключать, так не нажимайте - какие проблемы?

Пробуйте этот вариант. После зажатия через Ctrl+F_, нажатие на эту же кнопку/клавишу игнорируется, пока не отключите режим зажатия. Режим зажатия не зависит от "галочки", но "галочка", как и раньше, включает/выключает обработку нажатия. Вернул задержку от первого нажатия до начала "клацанья".
Код:
#include <Misc.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

HotKeySet("{PAUSE}", "Start")
HotKeySet("+{ESC}", "Quit")

$GUI = GUICreate("Кликер", 455, 190)
$InpDownUp = GUICtrlCreateInput("", 5, 5, 50, 20, 0x2000)
GUICtrlSetData(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", "5")))
GUICtrlCreateLabel("задержка в миллисекундах между нажатием и отпусканием кнопки мыши", 60, 5, 380, 20, 0x0200)
$InpClicks = GUICtrlCreateInput("", 5, 30, 50, 20, 0x2000)
GUICtrlSetData(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", "30")))
GUICtrlCreateLabel("задержка в миллисекундах между одиночными кликами", 60, 30, 380, 20, 0x0200)
$InpFirst = GUICtrlCreateInput("", 5, 55, 50, 20, 0x2000)
GUICtrlSetData(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", "100")))
GUICtrlCreateLabel("задержка в миллисекундах после первого клика", 60, 55, 380, 20, 0x0200)
$InpLBtn = GUICtrlCreateCheckbox("Левая кнопка (Shift+F1)", 5, 85, 150, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", "4")))
$InpRBtn = GUICtrlCreateCheckbox("Правая кнопка (Shift+F2)", 160, 85, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", "4")))
$InpKey = GUICtrlCreateCheckbox("Код клавиши (Shift+F3)", 5, 115, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", "4")))
$InpCode = GUICtrlCreateInput("", 160, 115, 25, 20)
GUICtrlSetLimit(-1, 2)
GUICtrlSetData(-1, IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", "20"))
GUICtrlCreateLabel("Pause  -  установка/снятие кликера с паузы", 5, 145, 230, 20, 0x0200)
GUICtrlCreateLabel("Shift+ESC  -  прекращение работы скрипта", 5, 165, 230, 20, 0x0200)
$BtnStart = GUICtrlCreateButton("Готово", 350, 85, 100, 100)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $BtnStart
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", GUICtrlRead($InpDownUp))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", GUICtrlRead($InpClicks))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", GUICtrlRead($InpFirst))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", GUICtrlRead($InpLBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", GUICtrlRead($InpRBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", GUICtrlRead($InpKey))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", GUICtrlRead($InpCode))
      ExitLoop
  EndSwitch
Until 0

Global $DownUpDelay =  GUICtrlRead($InpDownUp)
Global $ClicksDelay = GUICtrlRead($InpClicks)
Global $FirstDelay = GUICtrlRead($InpFirst)
Global $Left = GUICtrlRead($InpLBtn) = 1
Global $Right = GUICtrlRead($InpRBtn) = 1
Global $Key = GUICtrlRead($InpKey) = 1
Global $Code = GUICtrlRead($InpCode)
Global $Llock, $Rlock, $Klock
Global $LNeedFirst = True, $RNeedFirst = True, $KNeedFirst = True
Global $Start = True
GUIDelete($GUI)

HotKeySet("+{F1}", "LOnOff")
HotKeySet("+{F2}", "ROnOff")
HotKeySet("+{F3}", "KOnOff")
HotKeySet("^{F1}", "Llock")
HotKeySet("^{F2}", "Rlock")
HotKeySet("^{F3}", "Klock")

While Sleep(10)
  If $Start Then
    ClickPress("01")
    ClickPress("02")
    ClickPress($Code)
  EndIf
WEnd

Func ClickPress($Btn)
  Local $tPoint = _WinAPI_GetMousePos()
  Local $hWin = _WinAPI_WindowFromPoint($tPoint)
  _WinAPI_ScreenToClient($hWin, $tPoint)
  Switch $Btn
    Case "01"
      If $Llock Then
        LeftDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
      Else
        If $Left And CheckFirst("01") Then LeftDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
      EndIf
    Case "02"
      If $Rlock Then
        RightDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
      Else
        If $Right And CheckFirst("02") Then RightDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
      EndIf
    Case Else
      If $Klock Then
        KeyPress($Btn)
      Else
        If $Key And CheckFirst($Btn) Then KeyPress($Btn)
      EndIf
  EndSwitch
  Sleep($ClicksDelay)
EndFunc

Func LeftDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
EndFunc

Func RightDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONUP))
EndFunc

Func KeyPress($Code)
  _WinAPI_Keybd_Event("0x" & $Code, 0)
  Sleep($DownUpDelay)
  _WinAPI_Keybd_Event("0x" & $Code, 2)
EndFunc

Func CheckFirst($Btn)
  Switch $Btn
    Case "01"
      If Not _IsPressed("01") Then
        $LNeedFirst = True
        Return 0
      EndIf
      If Not $LNeedFirst Then Return 1
      Local $Timer = TimerInit()
      Do
        If Not _IsPressed("01") Then
          $LNeedFirst = True
          Return 0
        EndIf
        Sleep(10)
      Until TimerDiff($Timer) > $FirstDelay
      $LNeedFirst = False
      Return 1
    Case "02"
      If Not _IsPressed("02") Then
        $RNeedFirst = True
        Return 0
      EndIf
      If Not $RNeedFirst Then Return 1
      Local $Timer = TimerInit()
      Do
        If Not _IsPressed("02") Then
          $RNeedFirst = True
          Return 0
        EndIf
        Sleep(10)
      Until TimerDiff($Timer) > $FirstDelay
      $RNeedFirst = False
      Return 1
    Case Else
      If Not _IsPressed($Btn) Then
        $KNeedFirst = True
        Return 0
      EndIf
      If Not $KNeedFirst Then Return 1
      Local $Timer = TimerInit()
      Do
        If Not _IsPressed($Btn) Then
          $KNeedFirst = True
          Return 0
        EndIf
        Sleep(10)
      Until TimerDiff($Timer) > $FirstDelay
      $KNeedFirst = False
      Return 1
  EndSwitch
EndFunc

Func Start()
  $Start = Not $Start
EndFunc

Func Quit()
  Exit
EndFunc

Func LOnOff()
  $Left = Not $Left
EndFunc

Func ROnOff()
  $Right = Not $Right
EndFunc

Func KOnOff()
  $Key = Not $Key
EndFunc

Func Llock()
  $Llock = Not $Llock
EndFunc

Func Rlock()
  $Rlock = Not $Rlock
EndFunc

Func Klock()
  $Klock = Not $Klock
EndFunc
 
Автор
P

Perfix23

Новичок
Сообщения
19
Репутация
0
InnI сказал(а):
независимо от этих "галочек", вы нигде не уточняли.
Согласен, так же Я нигде на них внимания не заострял. Я пытаюсь объяснить желаемое как можно проще, простите если у меня это плохо выходит. :-[

Так зачем вы повторно нажимаете?!
Дабы включить этот мод зажатия. Просто этот мод (например ctrl+F1) выключается после тогда как Я пальцем нажму на лкм. Намного быстрее и очень удобно. А так, при необходимости включить этот мод мне нужно 2 раза нажимать ctrl+F1.

Мне показалось, после моего ответа #6, Я окончательно запутал Вас. Просто уже в 3-х пробниках скрипта не зависимо от состояния вкл/выкл Shift+F_, комбинация Ctrl+F_ клацает свою кнопку. Возможно Я не так объяснил.

Я быстро опишу как представляет мое воображение оконечную версию кликера.

Галочки больше не трогаем. И так, есть 3 кнопки ЛКМ (shift+F1 ctrl+F1), ПКМ (shift+F2 crtl+F2), Пробел (shift+F3 ctrl+F3), Я разберу пример с ЛКМ, а относится это ко всем трем. Также есть 2 мода:
-клацанье (Shift+F1) при включенном моде, Я зажал ЛКМ пальцем, а скрипт клацает эту кнопку;
-зажатие (ctrl+F1) при включенном моде Shift+F1, комбинация ctrl+F1 начнет клацать ЛКМ (т.е Я при этом палец на ЛКМ могу не держать, клацать все равно будет до тех пор пока Я пальцем не нажму ЛКМ), а при выключенном моде Shift+F1, комбинация ctrl+F1 просто зажмет ЛКМ (будто Я пальцем зажал ЛКМ).

Вот и вся задумка. Знаменательно то, что Вы уже создали все описанное. Т.е ничего не нужно придумывать нового.
Код:
#include <Misc.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

HotKeySet("{PAUSE}", "Start")
HotKeySet("+{ESC}", "Quit")

$GUI = GUICreate("Кликер", 455, 190)
$InpDownUp = GUICtrlCreateInput("", 5, 5, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", "5"))))
GUICtrlCreateLabel("задержка в миллисекундах между нажатием и отпусканием кнопки мыши", 60, 5, 380, 20, 0x0200)
$InpClicks = GUICtrlCreateInput("", 5, 30, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", "30"))))
GUICtrlCreateLabel("задержка в миллисекундах между одиночными кликами", 60, 30, 380, 20, 0x0200)
$InpFirst = GUICtrlCreateInput("", 5, 55, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", "100"))))
GUICtrlCreateLabel("задержка в миллисекундах после первого клика", 60, 55, 380, 20, 0x0200)
$InpLBtn = GUICtrlCreateCheckbox("Левая кнопка (Shift+F1)", 5, 85, 150, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", "4")))
$InpRBtn = GUICtrlCreateCheckbox("Правая кнопка (Shift+F2)", 160, 85, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", "4")))
$InpKey = GUICtrlCreateCheckbox("Код клавиши (Shift+F3)", 5, 115, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", "4")))
$InpCode = GUICtrlCreateInput("", 160, 115, 25, 20)
GUICtrlSetLimit(-1, 2)
GUICtrlSetData(-1, IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", "20"))
GUICtrlCreateLabel("Pause  -  установка/снятие кликера с паузы", 5, 145, 230, 20, 0x0200)
GUICtrlCreateLabel("Shift+ESC  -  прекращение работы скрипта", 5, 165, 230, 20, 0x0200)
$BtnStart = GUICtrlCreateButton("Готово", 350, 85, 100, 100)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $BtnStart
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", GUICtrlRead($InpDownUp))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", GUICtrlRead($InpClicks))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", GUICtrlRead($InpFirst))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", GUICtrlRead($InpLBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", GUICtrlRead($InpRBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", GUICtrlRead($InpKey))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", GUICtrlRead($InpCode))
      ExitLoop
  EndSwitch
Until 0

Global $DownUpDelay =  GUICtrlRead($InpDownUp)
Global $ClicksDelay = GUICtrlRead($InpClicks)
Global $FirstDelay = GUICtrlRead($InpFirst)
Global $Left = GUICtrlRead($InpLBtn) = 1
Global $Right = GUICtrlRead($InpRBtn) = 1
Global $Key = GUICtrlRead($InpKey) = 1
Global $Code = GUICtrlRead($InpCode)
Global $Start = True
GUIDelete($GUI)

HotKeySet("+{F1}", "LOnOff")
HotKeySet("+{F2}", "ROnOff")
HotKeySet("+{F3}", "KOnOff")

Do
  If $Start Then
    If $Left Then ClickPress("01")
    If $Right Then ClickPress("02")
    If $Key Then ClickPress($Code)
  EndIf
  Sleep(10)
Until 0

Func ClickPress($Btn)
  If _IsPressed($Btn) Then
    $Timer = TimerInit()
    Do
      If Not _IsPressed($Btn) Then ExitLoop
      Sleep(10)
    Until TimerDiff($Timer) > $FirstDelay
    If Not _IsPressed($Btn) Then
      Return
    Else
      Switch $Btn
        Case "01", "02"
          Do
            $tPoint = _WinAPI_GetMousePos()
            $hWin = _WinAPI_WindowFromPoint($tPoint)
            _WinAPI_ScreenToClient($hWin, $tPoint)
            Switch $Btn
              Case "01"
                LeftDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
              Case "02"
                RightDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
            EndSwitch
            Sleep($ClicksDelay)
          Until Not _IsPressed($Btn)
        Case Else
          Do
            _WinAPI_Keybd_Event("0x" & $Btn, 0)
            Sleep($DownUpDelay)
            _WinAPI_Keybd_Event("0x" & $Btn, 2)
            Sleep($ClicksDelay)
          Until Not _IsPressed($Btn)
      EndSwitch
    EndIf
  EndIf
EndFunc

Func LeftDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
EndFunc

Func RightDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONUP))
EndFunc

Func Start()
  $Start = Not $Start
EndFunc

Func Quit()
  Exit
EndFunc

Func LOnOff()
  $Left = Not $Left
EndFunc

Func ROnOff()
  $Right = Not $Right
EndFunc

Func KOnOff()
  $Key = Not $Key
EndFunc

Если же 2 последних пункта из ответа #12 не удалось реализовать именно в этой версии кликера, то просто сделайте смените в этом скрипте все alt+F_ на ctrl+F_. Спасибо :smile:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Perfix23
Я зажал ЛКМ пальцем, а скрипт клацает эту кнопку
комбинация ctrl+F1 просто зажмет ЛКМ
Вы что, не понимаете? При зажатии начнётся клацанье, т.е. вот это:
комбинация ctrl+F1 начнет клацать ЛКМ
Вы либо сами запутались, либо не понимаете, что "клик" - это "нажатие и отжатие". Невозможно одновременно программно удерживать кнопку нажатой и программно же кликать. Каждый клик будет "отжимать" кнопку, после чего её опять нужно нажать. А для игр это критично - они умеют отличать удержание в нажатом состоянии от клика.

Perfix23
Замените ! на ^ чтобы получилось так:
Код:
HotKeySet("^{F1}", "Llock")
HotKeySet("^{F2}", "Rlock")
HotKeySet("^{F3}", "Klock")


На этом всё. Удачи в поиске исполнителя.
 
Автор
P

Perfix23

Новичок
Сообщения
19
Репутация
0
InnI
InnI сказал(а):
Невозможно одновременно программно удерживать кнопку нажатой и программно же кликать. Каждый клик будет "отжимать" кнопку, после чего её опять нужно нажать.
Либо Вы невнимательно читаете и пропускаете важные части моих сообщений, либо пытаетесь найти скрытый посыл в тексте. Где Вы увидели в моих сообщения слово или намек на "одновременно"?

Все что Я описывал, все работает и все возможно в этом скрипте:
Код:
#include <Misc.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

HotKeySet("{PAUSE}", "Start")
HotKeySet("+{ESC}", "Quit")

$GUI = GUICreate("Кликер", 455, 190)
$InpDownUp = GUICtrlCreateInput("", 5, 5, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", "5"))))
GUICtrlCreateLabel("задержка в миллисекундах между нажатием и отпусканием кнопки мыши", 60, 5, 380, 20, 0x0200)
$InpClicks = GUICtrlCreateInput("", 5, 30, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", "30"))))
GUICtrlCreateLabel("задержка в миллисекундах между одиночными кликами", 60, 30, 380, 20, 0x0200)
$InpFirst = GUICtrlCreateInput("", 5, 55, 50, 20, 0x2000)
GUICtrlSetData(-1, Abs(Int(IniRead(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", "100"))))
GUICtrlCreateLabel("задержка в миллисекундах после первого клика", 60, 55, 380, 20, 0x0200)
$InpLBtn = GUICtrlCreateCheckbox("Левая кнопка (Shift+F1)", 5, 85, 150, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", "4")))
$InpRBtn = GUICtrlCreateCheckbox("Правая кнопка (Shift+F2)", 160, 85, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", "4")))
$InpKey = GUICtrlCreateCheckbox("Код клавиши (Shift+F3)", 5, 115, 140, 20)
GUICtrlSetState(-1, Int(IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", "4")))
$InpCode = GUICtrlCreateInput("", 160, 115, 25, 20)
GUICtrlSetLimit(-1, 2)
GUICtrlSetData(-1, IniRead(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", "20"))
GUICtrlCreateLabel("Pause  -  установка/снятие кликера с паузы", 5, 145, 230, 20, 0x0200)
GUICtrlCreateLabel("Shift+ESC  -  прекращение работы скрипта", 5, 165, 230, 20, 0x0200)
$BtnStart = GUICtrlCreateButton("Готово", 350, 85, 100, 100)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $BtnStart
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "DownUpDelay", GUICtrlRead($InpDownUp))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "ClicksDelay", GUICtrlRead($InpClicks))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Delay", "FirstDelay", GUICtrlRead($InpFirst))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Left", GUICtrlRead($InpLBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Right", GUICtrlRead($InpRBtn))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Key", GUICtrlRead($InpKey))
      IniWrite(@ScriptDir & "\DelaySets.ini", "Buttons", "Code", GUICtrlRead($InpCode))
      ExitLoop
  EndSwitch
Until 0

Global $DownUpDelay =  GUICtrlRead($InpDownUp)
Global $ClicksDelay = GUICtrlRead($InpClicks)
Global $FirstDelay = GUICtrlRead($InpFirst)
Global $Left = GUICtrlRead($InpLBtn) = 1
Global $Right = GUICtrlRead($InpRBtn) = 1
Global $Key = GUICtrlRead($InpKey) = 1
Global $Code = GUICtrlRead($InpCode)
Global $Start = True
Global $Llock = False
Global $Rlock = False
Global $Klock = False
GUIDelete($GUI)

HotKeySet("+{F1}", "LOnOff")
HotKeySet("+{F2}", "ROnOff")
HotKeySet("+{F3}", "KOnOff")
HotKeySet("^{F1}", "Llock")
HotKeySet("^{F2}", "Rlock")
HotKeySet("^{F3}", "Klock")

Do
  If $Start Then
    If $Left Then ClickPress("01")
    If $Right Then ClickPress("02")
    If $Key Then ClickPress($Code)
  EndIf
  Sleep(10)
Until 0

Func ClickPress($Btn)
  If _IsPressed($Btn) Then
    $Timer = TimerInit()
    Do
      If Not _IsPressed($Btn) Then ExitLoop
      Sleep(10)
    Until TimerDiff($Timer) > $FirstDelay
    If Not _IsPressed($Btn) Then
      Return
    Else
      Switch $Btn
        Case "01", "02"
          Do
            $tPoint = _WinAPI_GetMousePos()
            $hWin = _WinAPI_WindowFromPoint($tPoint)
            _WinAPI_ScreenToClient($hWin, $tPoint)
            Switch $Btn
              Case "01"
                LeftDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
              Case "02"
                RightDownUp($hWin, $tPoint.X, $tPoint.Y, $DownUpDelay)
            EndSwitch
            Sleep($ClicksDelay)
          Until Not _IsPressed($Btn)
        Case Else
          Do
            _WinAPI_Keybd_Event("0x" & $Btn, 0)
            Sleep($DownUpDelay)
            _WinAPI_Keybd_Event("0x" & $Btn, 2)
            Sleep($ClicksDelay)
          Until Not _IsPressed($Btn)
          If $Klock Then _WinAPI_Keybd_Event("0x" & $Btn, 0)
      EndSwitch
    EndIf
  EndIf
EndFunc

Func LeftDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
EndFunc

Func RightDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_RBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_RBUTTONUP))
EndFunc

Func Start()
  $Start = Not $Start
EndFunc

Func Quit()
  Exit
EndFunc

Func LOnOff()
  $Left = Not $Left
EndFunc

Func ROnOff()
  $Right = Not $Right
EndFunc

Func KOnOff()
  $Key = Not $Key
EndFunc

Func Llock()
  $Llock = Not $Llock
  If $Llock Then
    MouseDown("left")
  Else
    MouseUp("left")
  EndIf
EndFunc

Func Rlock()
  $Rlock = Not $Rlock
  If $Rlock Then
    MouseDown("right")
  Else
    MouseUp("right")
  EndIf
EndFunc

Func Klock()
  $Klock = Not $Klock
  If $Klock Then
    _WinAPI_Keybd_Event("0x" & $Code, 0)
  Else
    _WinAPI_Keybd_Event("0x" & $Code, 2)
  EndIf
EndFunc

Просто Вы же каким-то образом, смогли добавить в скрипт в ответе #3 сам мод зажатия и включение и выключение этого мода на комбинации ctrl+F_. А сделать тоже самое, но вместо добавления включения и выключения мода зажатия, добавить только включение этого мода этими комбинациями (ctrl+F_), Вы говорите невозможно :scratch:

InnI сказал(а):
На этом всё. Удачи в поиске исполнителя.
Мы уже так далеко зашли, что мне вряд ли кто-то поможет. Прискорбно осознавать то, что на такой ноте пришел конец.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
В функциях Llock(),Rlock() и Klock() убираете строки типа $Llock = Not $Llock и не будет вам переключения.


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

или вместо убирания ставьте $Llock = True. $Rlock = True итп


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

Код:
Global $Llock = True
Global $Rlock = True
Global $Klock =True

...

Func Llock()
  If $Llock Then
    MouseDown("left")
  Else
    MouseUp("left")
  EndIf
EndFunc
 
Верх