Что нового

[Мышь, клавиатура] Много действий на одной кнопке

sineva768

Новичок
Сообщения
8
Репутация
0
3381

Помогите сделать Скрипт\макрос вообщем не знаю как лучше, их два, потом выберу лучший, вообщем такой при нажатии горячей клавиши, пусть это будет цифра "5" нажимались следующие клавиши "D 4 Q R Q" с не большой задержкой 100мс +-"
И ещё один такой же, только что бы я нажимал одну кнопку "5" снова и снова, и водилась эта комбинация по порядку >
"D 4 Q R Q" по истечение секунд 2-4, комбинация начиналась с первой буквы.
:

И ещё, для работы вот такого макроса, только в приложении 3д, во весь экран, нужно что-то написать ???
Спасибо большое кто поможет, я думаю это не сложный макрос.:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: [Мышь, клавиатура] Помогите сделать макрос

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"[Мышь, клавиатура] Помогите сделать макрос" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Глобальный модератор.










сообщение жирным целиком не приветствуется.
 
Автор
S

sineva768

Новичок
Сообщения
8
Репутация
0
Re: [Мышь, клавиатура] Помогите сделать макрос

исправил
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
sineva768 [?]
при нажатии горячей клавиши, пусть это будет цифра "5" нажимались следующие клавиши "D 4 Q R Q" с не большой задержкой 100мс +-
Код:
HotKeySet("5", "go")

$delay = 100 ; задержка

Do
  Sleep(300)
Until 0

Func go()
  Send("d")
  Sleep($delay)
  Send("4")
  Sleep($delay)
  Send("q")
  Sleep($delay)
  Send("r")
  Sleep($delay)
  Send("q")
  Sleep($delay)
EndFunc

что бы я нажимал одну кнопку "5" снова и снова, и водилась эта комбинация по порядку >
"D 4 Q R Q" по истечение секунд 2-4, комбинация начиналась с первой буквы
Не понял условия. Что значит "снова и снова"?
 
Автор
S

sineva768

Новичок
Сообщения
8
Репутация
0
Нажимаю 5 - нажимается d, потом следующая значение по списку(4qrq), и так если все 5 комбинации, за 2-4 секунды не будут нажаты, макрос сбрасывается на начальное значение.


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

InnI
Работает первый вариант только в винде, в 3-д приложении нет.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
sineva768 [?]
Нажимаю 5 - нажимается d, потом следующая значение по списку(4qrq), и так если все 5 комбинации, за 2-4 секунды не будут нажаты, макрос сбрасывается на начальное значение.
Код:
HotKeySet("5", "Press")
AdlibRegister("Reset", 3000) ; сброс каждые 3 секунды

Dim $key[5] = ["d","4","q","r","q"]
$i = 0

Do
  Sleep(10)
Until 0

Func Press()
  Send($key[$i])
  $i += 1
  If $i = UBound($key) Then Reset()
EndFunc

Func Reset()
  $i = 0
EndFunc

Работает первый вариант только в винде, в 3-д приложении нет.
Некоторые игры защищены от имитации нажатий.
Если у вас русская раскладка по умолчанию, то посмотрите здесь:
http://autoit-script.ru/index.php?topic=314.0
 
Автор
S

sineva768

Новичок
Сообщения
8
Репутация
0
В игре не работает, на сколько мне известно защиты никакой нету, как это окно прописать ???
 
Автор
S

sineva768

Новичок
Сообщения
8
Репутация
0
Ну это игра как эту игру прописать что бы в ней работало ??? можешь объяснить ???
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
sineva768 [?]
Название у этой игры есть? Или это секрет?
как эту игру прописать что бы в ней работало
Send() посылает нажатия в активное окно. Если вы нажимаете кнопки и игра на них реагирует, значит окно игры активно и Send() отправляет нажатия в игру. Почему игра не воспринимает имитацию - это уже другой вопрос.

Раскладка клавиатуры по умолчанию у вас русская или английская?
Если игра запускается в правами администратора на Windows7, то и скрипт нужно запускать с правами администратора.
 
Автор
S

sineva768

Новичок
Сообщения
8
Репутация
0
Вообщем в саму игру не получается сделать хоткей на определенные действия описанные выше.
Вот как я пробовал...
Код:
HotKeySet("5", "go")

$delay = 100 ; задержка
$caption = "название самое игры"

Do
  Sleep(300)
Until 0

Func go()
  ControlSend($caption, "", "", "d")
  Sleep($delay)
  ControlSend($caption, "", "", "4")
  Sleep($delay)
  ControlSend($caption, "", "", "q")
  Sleep($delay)
  ControlSend($caption, "", "", "r")
  Sleep($delay)
  ControlSend($caption, "", "", "q")
  Sleep($delay)
EndFunc
Нажимаю и ничего не происходит.

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

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Пробуем. Вместо клавиши "5" использовать клавишу "7".
Библиотеку WinAPIEx.au3 брать здесь: http://autoit-script.ru/index.php?topic=47.0
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>

Opt("SendKeyDownDelay", 30) ; задержка между нажатием и отпусканием одной клавиши
Opt("SendKeyDelay", 100) ; задержка между отпусканием клавиши и нажатием следующей

OnAutoItExitRegister("Cleanup")

$hStub_KeyProc = DllCallbackRegister("KeyProc", "long", "int;wparam;lparam")
$hmod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)

While 1
  Sleep(1000)
WEnd

Func KeyProc($nCode, $wParam, $lParam)
  Local $tKEYHOOKS
  $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
  If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
  If $wParam = $WM_KEYDOWN Then
    If DllStructGetData($tKEYHOOKS, "vkCode") = 0x37 Then ; код клавиши "7"
      SendKey()
      Return -1
    EndIf
  EndIf
  Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc

Func Cleanup()
  _WinAPI_UnhookWindowsHookEx($hHook)
  DllCallbackFree($hStub_KeyProc)
EndFunc

Func SendKey()
  Send("d4qrq")
EndFunc
 
Автор
S

sineva768

Новичок
Сообщения
8
Репутация
0
Теперь действия в игре срабатывает, но я не правильные условия написал,нужно ещё после каждой кнопки нажимать левую, кнопки мышки, мне кажется так будет очень плохо, и не удобно,и для него надо отдельную задержку делать.
Вообщем если не сложно по такому же принципу только с таким условием, и почему именно клавиша 7 вместо 5 ???? я пробовал сам переназначить это вроде 5- 0x35, но не получилось.
Нажимаю 5 - нажимается d, потом следующая значение по списку(4qrq), и так если все 5 комбинации, за 2-4 секунды не будут нажаты, макрос сбрасывается на начальное значение.
буду очень благодарен :beer:
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
sineva768 [?]
почему именно клавиша 7 вместо 5
Потому, что клавиша 5 используется самой игрой.
Пробуем "по такому же принципу только с таким условием"
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>

Opt("SendKeyDownDelay", 30) ; задержка между нажатием и отпусканием одной клавиши
$delay = 3000 ; время на ввод всех клавиш до сброса

OnAutoItExitRegister("Cleanup")
Dim $key[5] = ["d","4","q","r","q"]
$i = 0

$hStub_KeyProc = DllCallbackRegister("KeyProc", "long", "int;wparam;lparam")
$hmod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)

While 1
  Sleep(1000)
WEnd

Func KeyProc($nCode, $wParam, $lParam)
  Local $tKEYHOOKS
  $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
  If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
  If $wParam = $WM_KEYDOWN Then
    If DllStructGetData($tKEYHOOKS, "vkCode") = 0x37 Then ; код клавиши "7"
      SendKey()
      Return -1
    EndIf
  EndIf
  Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc

Func Cleanup()
  _WinAPI_UnhookWindowsHookEx($hHook)
  DllCallbackFree($hStub_KeyProc)
EndFunc

Func SendKey()
  If $i = 0 Then AdlibRegister("Reset", $delay)
  Send($key[$i])
  $i += 1
  If $i = UBound($key) Then Reset()
EndFunc

Func Reset()
  AdlibUnRegister("Reset")
  $i = 0
EndFunc



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

sineva768 [?]
я пробовал сам переназначить это вроде 5- 0x35, но не получилось
Я попробовал заменить 0х37 на 0х35 - у меня получилось. Стала работать кнопка "5".
Не забудьте перезапустить скрипт после изменений.
 
Автор
S

sineva768

Новичок
Сообщения
8
Репутация
0
Работает но не так как хотелось бы, вообщем всем спасибо тему можно закрывать. :beer:
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 
Верх