1

Тема: AHK: Сброс счетчика нажатием любой другой клавиши

Здравствуйте. Слабо разбираюсь в программировании, использую только самые простейшие скрипты AHK в играх. Но пытаюсь разобраться по мере возможностей
Вот простой счетчик, который по нажатию клавиши перебирает нужные мне варианты в игре.
Как сделать так, чтобы при нажатии вообще любой другой клавиши (в том числе и на мышке), счетчик сбрасывался и, в случае, если я снова нажму на эту клавишу, начинал с первого заданного значения?
Дело в том, что таких счетчиков у меня много, и всюду нужны «приоритеты».

*VK57::
{
if bct=1
{
SendInput, {Ins}
bct=2
return
}
if bct=2
{
SendInput, {Del}
bct=1
return
}
SendInput, {Ins}
bct=2
return
}

2 (изменено: Grey, 2011-12-20 21:08:19)

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Я так понял, что Вам нужно при первом нажатии на W эмулировать нажатие на Ins, потом Del.

Uzbek пишет:

Как сделать так, чтобы при нажатии вообще любой другой клавиши (в том числе и на мышке), счетчик сбрасывался и, в случае, если я снова нажму на эту клавишу, начинал с первого заданного значения?

Можно обнулять счётчик к примеру той же кнопкой:

*vk57::
   StartTime:=A_TickCount
   SendInput, % "{"((bct:=!bct) ? "Ins":"Del")"}"
   KeyWait, vk57
   If A_TickCount-StartTime>300 ; время чувствительности
      bct:=0
   Return

Нажали-удерживаете - эмулируется первое нажатие (Ins), отпустили, при последующем нажатии будет опять Ins, если нужно, чтобы было чередование, то удерживать после нажатия не надо. Время удержания, чтобы переменная-счётчик обнулялась можно подобрать. Если нужно, чтобы можно было обнулять любой другой, то как-то так:

*vk57::
   SendInput, % "{"((bct:=!bct) ? "Ins":"Del")"}"
   KeyWait, vk57
   Return

~LButton::bct:=0
; или
~LShift::bct:=0

3

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Я так понял, что Вам нужно при первом нажатии на W эмулировать нажатие на Ins, потом Del.

Да. Не обязательно две — в некоторых случаях три, или четыре других клавиши. Перебираю по очереди, как бы. С каждым нажатием.

Можно обнулять счётчик к примеру той же кнопкой

Это вот, к сожалению, не самый подходящий вариант. Времени в бою нет особо, чтобы еще дополнительной кнопкой что-то обнулять


Идеальный вариант — это когда, допустим, я нажимаю W (нажимаю «обычно», т.е. быстро нажимаю и отпускаю), то эмулировалось нажатие, скажем, Ins, и так далее. НО. Если я резко нажму вообще какую-то совершенно другую клавишу (не какую-то конкретную, а просто любую на клавиатуре, но не W, ес-но), то даже если я тут же вернусь опять к W, очередность опять начиналась с Ins, а не продолжалась дальше (как это сейчас и работает).

Возможно ли это в принципе?

Если да, то это прекрасно Если нет, то есть следующие мысли. Можно составить список всех клавиш, которые я использую, и прописать для них для всех сброс всех предыдущих счетчиков (если я не ошибаюсь, это точно возможно сделать).
Или сделать что-то вроде таймера. Например, после 5 секунд счетчик сбрасывается. Такое возможно?

4

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Ваш вариант с LButton тоже, в принципе, пойдет.
Скажите, а как правильно прописать сброс нескольких счетчиков? Не только bct, а еще и act, cct, dct и так далее.

5

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Ваш идеальный вариант готов:

*vk57::
   If % A_ThisHotkey<>Dec2Hex(GetKeyVK(A_PriorKey))
      bct:=0
   SendInput, % "{"((bct:=!bct) ? "Ins":"Del")"}"
   KeyWait, vk57
   Return

Dec2Hex(DecData)
{
   HexData:=0000
   DllCall("msvcrt.dll\s"(A_IsUnicode ? "w":"")"printf", "Str", HexData
                                                       , "Str", "*vk%02x"
                                                       , "UInt", DecData)
   Return, HexData
}
Uzbek пишет:

...как правильно прописать сброс нескольких счетчиков?

~LButton::bct:=act:=cct:=dct:=0

6

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Ваш идеальный вариант готов

Спасибо огромное, пойду тестить.

А для других счетчиков (коих у меня много) надо будет поправить примерно так? (Например, для vk51, и для других клавиш.)

*vk51::
   If % A_ThisHotkey<>Dec2Hex(GetKeyVK(A_PriorKey))
      bct:=0
   SendInput, % "{"((act:=!act) ? "Home":"End":"PgUp")"}"
   KeyWait, vk51
   Return
 
Dec2Hex(DecData)
{
   HexData:=0000
   DllCall("msvcrt.dll\s"(A_IsUnicode ? "q":"")"printf", "Str", HexData
                                                       , "Str", "*vk%02x"
                                                       , "UInt", DecData)
   Return, HexData
}

Если что, я чисто интуитивно тут в потемках шарюсь. Сомнение вызывает ваша "w" внизу — это клавиша, или это какая-то другая переменная? Я ее заменил на "q", потому что решил, что это клавиша

7

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Uzbek пишет:

...надо будет поправить примерно так?

Луше и быстрее будет, если я буду знать все клавиши и то, что они должны делать, и у Вас будет стартовый пример, для дальнейших разработок.

Uzbek пишет:

Сомнение вызывает ваша "w" внизу

Ну как-бы эта W (*vk57) изначально не моя, и пом, где внизу?

8

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Луше и быстрее будет, если я буду знать все клавиши и то, что они должны делать, и у Вас будет стартовый пример, для дальнейших разработок.

Без сомнений, это точно будет быстрее и лучше

Ну, вот vk51 (Q) — поочередное нажатие Home, End

vk52 — F6, F7, F8

И такой же сброс, конечно же.

Ну как-бы эта W (*vk57) изначально не моя, и пом, где внизу?

DllCall("msvcrt.dll\s"(A_IsUnicode ? "w"

9

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Проверил ваш код. Работает великолепно!

10

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Uzbek пишет:

DllCall("msvcrt.dll\s"(A_IsUnicode ? "w"

Хах, банальная опечатка, конечно же там должна быть w а не q. Я проверяю скрипты все после запуска прямо в редакторе, где их и пишу...

11

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Хах, банальная опечатка, конечно же там должна быть w а не q.

Так нет, у вас все было правильно. "q" — это я уже в своем исправленном варианте изменил. Т.е., я попробовал изменить код под другую клавишу (Q).

Кстати, при вставлении второго куска (уже для клавиши vk51, а не vk57) выдает ошибку Dec2Hex (Duplicate function definition).

12

Re: AHK: Сброс счетчика нажатием любой другой клавиши

А. По ходу, ее не нужно дублировать.

Нужно как-то так?

Dec2Hex(DecData)
{
   HexData:=0000
   DllCall("msvcrt.dll\s"(A_IsUnicode ? "w":"q":"r":"и так далее")"printf", "Str", HexData
                                                       , "Str", "*vk%02x"
                                                       , "UInt", DecData)
   Return, HexData
}

13

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Нет, это функция, она перегоняет десятеричное значение (получаемое от встроенной функции GetKeyVK, которая в свою очередь проверяет встроенную переменную A_PriorKey) в шестнадцатиричное с префиксом. Вы меня извините, я смогу помочь только вечером, ибо надо идти.

14

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Grey, в общем я сделал примерно так:

*vk57::
   If % A_ThisHotkey<>Dec2Hex(GetKeyVK(A_PriorKey))
      bct:=0
   SendInput, % "{"((bct:=!bct) ? "Ins":"Del")"}"
   KeyWait, vk57
   Return
 
*vk51::
   If % A_ThisHotkey<>Dec2Hex(GetKeyVK(A_PriorKey))
      act:=0
   SendInput, % "{"((act:=!act) ? "Home":"End")"}"
   KeyWait, vk51
   Return

*vk52::
   If % A_ThisHotkey<>Dec2Hex(GetKeyVK(A_PriorKey))
      rct:=0
   SendInput, % "{"((rct:=!rct) ? "F6":"F7")"}"
   KeyWait, vk52
   Return
 
Dec2Hex(DecData)
{
   HexData:=0000
   DllCall("msvcrt.dll\s"(A_IsUnicode ? "w":"")"printf", "Str", HexData
                                                       , "Str", "*vk%02x"
                                                       , "UInt", DecData)
   Return, HexData
}

Все вроде бы работает, но появилось два важных вопроса

1. Не получилось в третьем случае сделать ротацию трех кнопок вместо двух. Как бы туда еще F8 добавить после F6 и F7?

2. Самый важный вопрос, который вдруг всплыл после теста
Можно как-то внести два исключения (пробел и лев. кнопка мыши), при использовании которых никакие счетчики не сбрасывались бы?

15 (изменено: Александр_, 2011-12-12 22:50:16)

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Uzbek пишет:

Как сделать так, чтобы при нажатии вообще любой другой клавиши (в том числе и на мышке), счетчик сбрасывался и, в случае, если я снова нажму на эту клавишу, начинал с первого заданного значения?

На выбор:
1) использовать хуки(пример).
2) по таймеру проверять состояние клавиатуры и мыши.

Uzbek пишет:

A_IsUnicode ? "w":"q":"r":"и так далее"

16

Re: AHK: Сброс счетчика нажатием любой другой клавиши

#InstallMouseHook

*vk51:: ; q
*vk52:: ; r
*vk57:: ; w
   If % A_ThisHotkey<>Dec2Hex(GetKeyVK(A_PriorKey))
      If Dec2Hex(GetKeyVK(A_PriorKey))!="*vk20"
      And Dec2Hex(GetKeyVK(A_PriorKey))!="*vk01"
         bct:=rct:=act:=0
   If % A_ThisHotkey="*vk51"
      SendInput, % "{"((act:=!act) ? "Home":"End")"}"
   Else If % A_ThisHotkey="*vk52"
   {
      If !rct
      {
         SendInput, {F6}
         rct:=1
      }
      Else If rct=1
      {
         SendInput, {F7}
         rct:=2
      }
      Else If rct=2
      {
         SendInput, {F8}
         rct:=0
      }
   }
   Else If % A_ThisHotkey="*vk57"
      SendInput, % "{"((bct:=!bct) ? "Ins":"Del")"}"
   KeyWait, % A_ThisHotkey
   Return

Dec2Hex(DecData)
{
   HexData:=0000
   DllCall("msvcrt.dll\s"(A_IsUnicode ? "w":"")"printf", "Str", HexData
                                                       , "Str", "*vk%02x"
                                                       , "UInt", DecData)
   Return, HexData
}
Uzbek пишет:

Так нет, у вас все было правильно. "q" — это я уже в своем исправленном варианте изменил.

Угу, к чему спешка приводит...

17

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Grey, спасибо большое, все замечательно работает!

18 (изменено: Raam, 2011-12-20 04:19:41)

Re: AHK: Сброс счетчика нажатием любой другой клавиши

Как сделать так, чтобы при нажатии вообще любой другой клавиши (в том числе и на мышке), счетчик сбрасывался и, в случае, если я снова нажму на эту клавишу, начинал с первого заданного значения?

Когда то Teadrinker помог мне решить подобную задачу для игры. Мой скрипт  выглядит так:

$2::
If  A_PriorHotkey = 1
  {
  SetTimer, Nulling, -20
  Sleep, 40
  Send, %A_ThisHotkey%  
  }
Else If  A_PriorHotkey = 3
  {
  SetTimer, Nulling, -20
  Sleep, 40
  Send, %A_ThisHotkey%  
  }
Else If  A_PriorHotkey = 4
  {
  SetTimer, Nulling, -20
  Sleep, 40
  Send, %A_ThisHotkey%  
  }
Else If  A_PriorHotkey = 5
  {
  SetTimer, Nulling, -20
  Sleep, 40
  Send, %A_ThisHotkey%  
  }
Else If keystroke = ; если у переменной нет значения (пустое)
  {
    keystroke = 1 
    Send, 2
    SetTimer, Nulling, -4000 ; если в течении 4 секунды ничего не жать, "комбо" сбросится в стартовую позицию.
  } 
Else if keystroke = 1
  {
   keystroke = 2 ; присвоим переменной иное значение
    Send, 6
    SetTimer, Nulling, -4000
  }
Else if keystroke = 2
  {
    keystroke = ; очищаем переменную
    Send, 8
  }
Return


XButton2:: 
   SetTimer, Nulling, -40
   ToolTip, сброс, 400, 420 
   Sleep, 40
   ToolTip
Return


Nulling:
   keystroke =
   ToolTip сброс, 400, 430 
   Sleep, 100
   ToolTip
Return

Если я начинаю кликать другие клавиши - происходит сброс таймеров.
При нажатии на дополнительную клавишу мыши происходит принудительный сброс.