1

Тема: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Здраствуйте. При создании нужного мне скрипта я столкнулся с трудностями и прошу вашей помощи. Скрипт необходим для игры FIFA 11. Суть скрипта следующая:
Необходимо переназначить клавишу "С" на клавишу "Пробел" в одностороннем порядке, а "Пробел" на "LCTRL" также в одностроннем порядке; при этом, если нажата клавиша "Пробел" (т.е. C), то должно включаться переназначение клавиш "Стрелка ввверх", "Стрелка вниз", "Стрелка влево", "Стрелка вправо" на "Num8", "Num5", "Num4", "Num6" соответственно. После отпускания клавиши "Пробел" стрелки вновь должны стать стрелками. Также необходимо переназначение клавиш "Shift + Стрелка вверх, вниз, влево, вправо" на "Num8", "Num5", "Num4", "Num6", но с этим я вроде-бы разобрался.
Помогите написать код скрипта, пожалуйста.

2 (изменено: Grey, 2011-05-09 04:00:46)

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

LCtrl::
   Send, {Space Down}
   KeyWait, LCtrl
   Send, {Space Up}
Return

Space::
   replace := 1
   Send, {vk43 Down} ; c
Return
Space Up::
   Send, {vk43 Up}
   replace := 0
Return

Up::Send, % "{vk" (replace = 1 ? 68 : 26) " Down}"
Up Up::Send, % "{vk" (replace = 1 ? 68 : 26) " Up}"

Down::Send, % "{vk" (replace = 1 ? 65 : 28) " Down}"
Down Up::Send, % "{vk" (replace = 1 ? 65 : 28) " Up}"

Left::Send, % "{vk" (replace = 1 ? 64 : 25) " Down}"
Left Up::Send, % "{vk" (replace = 1 ? 64 : 25) " Up}"

Right::Send, % "{vk" (replace = 1 ? 66 : 27) " Down}"
Right Up::Send, % "{vk" (replace = 1 ? 66 : 27) " Up}"

3

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Спасибо за отклик и помощь! Однако скрипт работает не полностью:
Если в обычной среде (в блокноте, например) скрипт работает так, как необходимо, то в самой игре стрелки вообще перестали работать! Переназначение "С" на клавишу "Пробел" и "Пробел" на "LCTRL" работает нормально, а вот стрелки либо вообще не работают, либо работают неправильно. В других полноэкранных приложениях наблюдаются похожие проблемы. В чем же проблема, интересно?

4

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

А так?:

#UseHook
SendMode, Input
Return

LCtrl::
   Send, {Space Down}
   KeyWait, LCtrl
   Send, {Space Up}
Return

Space::
   replace := 1
   Send, {vk43 Down} ; c
Return
Space Up::
   Send, {vk43 Up}
   replace := 0
Return

Up::Send, % "{vk" (replace = 1 ? 68 : 26) " Down}"
Up Up::Send, % "{vk" (replace = 1 ? 68 : 26) " Up}"

Down::Send, % "{vk" (replace = 1 ? 65 : 28) " Down}"
Down Up::Send, % "{vk" (replace = 1 ? 65 : 28) " Up}"

Left::Send, % "{vk" (replace = 1 ? 64 : 25) " Down}"
Left Up::Send, % "{vk" (replace = 1 ? 64 : 25) " Up}"

Right::Send, % "{vk" (replace = 1 ? 66 : 27) " Down}"
Right Up::Send, % "{vk" (replace = 1 ? 66 : 27) " Up}"

5 (изменено: Twente, 2011-05-11 14:12:41)

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Вот, что получается теперь в полноэкранном приложении:
Стрелки переназначаются на num4, num5, num 6, num8 соотвественно;
Комбинации "Shift + Стрелки" переназначаются как "стрелки";

6

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente пишет:

Также необходимо переназначение клавиш "Shift + Стрелка вверх, вниз, влево, вправо" на "Num8", "Num5", "Num4", "Num6", но с этим я вроде-бы разобрался.

#UseHook
SendMode, Input
Return

LCtrl::
   Send, {Space Down}
   KeyWait, LCtrl
   Send, {Space Up}
Return

Space::
   replace := 1
   Send, {vk43 Down} ; c
Return
Space Up::
   Send, {vk43 Up}
   replace := 0
Return

Up::Send, % "{vk" (replace = 1 ? 68 : 26) " Down}"
Up Up::Send, % "{vk" (replace = 1 ? 68 : 26) " Up}"

Down::Send, % "{vk" (replace = 1 ? 65 : 28) " Down}"
Down Up::Send, % "{vk" (replace = 1 ? 65 : 28) " Up}"

Left::Send, % "{vk" (replace = 1 ? 64 : 25) " Down}"
Left Up::Send, % "{vk" (replace = 1 ? 64 : 25) " Up}"

Right::Send, % "{vk" (replace = 1 ? 66 : 27) " Down}"
Right Up::Send, % "{vk" (replace = 1 ? 66 : 27) " Up}"

Shift & Up::Send, {vk68 Down}
Shift & Up Up::Send, {vk68 Up}

Shift & Down::Send, {vk65 Down}
Shift & Down Up::Send, {vk65 Up}

Shift & Left::Send, {vk64 Down}
Shift & Left Up::Send, {vk64 Up}

Shift & Right::Send, {vk66 Down}
Shift & Right Up::Send, {vk66 Up}

7

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente пишет:

Также необходимо переназначение клавиш "Shift + Стрелка вверх, вниз, влево, вправо" на "Num8", "Num5", "Num4", "Num6", но с этим я вроде-бы разобрался.

Выяснилось, что не совсем!

Я более подробно напишу необходимые мне функции скрипта, а также работают они сейчас или нет (появились новые (!) ):

1) переназначить клавишу "С" на клавишу "Пробел" в одностороннем порядке;          --- работает
2) переназначить клавишу"Пробел" на "LCTRL";  --- работает
3) "по умолчанию" стрелки не переназначаются на другие клавиши;   --- не работает, сейчас стрелки переназначаются на num 4 - 8
4) если нажата клавиша "Пробел" (т.е. C), то должно включаться переназначение клавиш "Стрелка ввверх", "Стрелка вниз", "Стрелка влево", "Стрелка вправо" на "Num8", "Num5", "Num4", "Num6" соответственно;   --- не ясно, т.к. пункт 3 не работает
5) если клавиша "Пробел" отпущена, то стрелки вновь должны стать стрелками;  --- не ясно, т.к. пункт 3 не работает
6) переназначение комбинации "Shift + Стрелка вверх, вниз, влево, вправо"на "Num8", "Num5", "Num4", "Num6"; --- работает
! 7)переназначение комбинации "Стрелка вверх, вниз, влево, вправо + Shift" также на "Num8", "Num5", "Num4", "Num6"
! 8)переназначение комбинации  "E + стрелка вверх + Shift" (именно в таком порядке) на Num8 и других аналогичных комбинаций в другие направления соотвественно (num6, num4, num5)

8

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente пишет:

...в обычной среде (в блокноте, например) скрипт работает так, как необходимо

Twente пишет:

Вот, что получается теперь в приложении:
Стрелки переназначаются
на num4, num5, num 6, num8 соотвественно

Twente пишет:

3) "по умолчанию" стрелки не переназначаются на другие клавиши;   --- не работает...

Вы перечите самому себе.

#UseHook
SendMode, Input
Return

LCtrl::
   Send, {Space Down}
   KeyWait, LCtrl
   Send, {Space Up}
   Return

Space::
   Send, {vk43 Down} ; c
   Return
Space Up::
   Send, {vk43 Up}
   Return

*Up::
   back_up:
   Send, {vk68 Up}{vk26 Down}
   While GetKeyState("Up", "P")
      {
         Sleep, 30
         If (GetKeyState("Space", "P") OR GetKeyState("Shift", "P"))
            {
               Send, {vk26 Up}{vk68 Down} 
               While GetKeyState("Up", "P")
                  {
                     Sleep, 30
                     If (GetKeyState("Space", "P") OR GetKeyState("Shift", "P"))=0
                        Gosub, back_up
                  }
            }
      }
   Return
Up Up::Send, {vk26 Up}{vk68 Up}

*Down::
   back_down:
   Send, {vk65 Up}{vk28 Down}
   While GetKeyState("Down", "P")
      {
         Sleep, 30
         If (GetKeyState("Space", "P") OR GetKeyState("Shift", "P"))
            {
               Send, {vk28 Up}{vk65 Down}
               While GetKeyState("Down", "P")
                  {
                     Sleep, 30
                     If (GetKeyState("Space", "P") OR GetKeyState("Shift", "P"))=0
                        Gosub, back_down
                  }
            }
      }
   Return
Down Up::Send, {vk28 Up}{vk65 Up}

*Left::
   back_left:
   Send, {vk64 Up}{vk25 Down}
   While GetKeyState("Left", "P")
      {
         Sleep, 30
         If (GetKeyState("Space", "P") OR GetKeyState("Shift", "P"))
            {
               Send, {vk25 Up}{vk64 Down}
               While GetKeyState("Left", "P")
                  {
                     Sleep, 30
                     If (GetKeyState("Space", "P") OR GetKeyState("Shift", "P"))=0
                        Gosub, back_left
                  }
            }
      }
   Return
Left Up::Send, {vk25 Up}{vk64 Up}

*Right::
   back_right:
   Send, {vk66 Up}{vk27 Down}
   While GetKeyState("Right", "P")
      {
         Sleep, 30
         If (GetKeyState("Space", "P") OR GetKeyState("Shift", "P"))
            {
               Send, {vk27 Up}{vk66 Down}
               While GetKeyState("Right", "P")
                  {
                     Sleep, 30
                     If (GetKeyState("Space", "P") OR GetKeyState("Shift", "P"))=0
                        Gosub, back_right
                  }
            }
      }
   Return
Right Up::Send, {vk27 Up}{vk66 Up}

vk45 & Up:: ; e
   If GetKeyState("Shift", "P")
   Send, {vk45 Down}{vk68 Down}
   Return
vk45 & Up Up::Send, {vk45 Up}{vk68 Up}

vk45 & Down::
   If GetKeyState("Shift", "P")
   Send, {vk45 Down}{vk65 Down}
   Return
vk45 & Down Up::Send, {vk45 Up}{vk65 Up}

vk45 & Left::
   If GetKeyState("Shift", "P")
   Send, {vk45 Down}{vk64 Down}
   Return
vk45 & Left Up::Send, {vk45 Up}{vk64 Up}

vk45 & Right::
   If GetKeyState("Shift", "P")
   Send, {vk45 Down}{vk66 Down}
   Return
vk45 & Right Up::Send, {vk45 Up}{vk66 Up}

9

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Второй вариант концовки предыдущего скрипта:

~vk45 & Up:: ; e
   If GetKeyState("Shift", "P")
      Send, {vk68 Down}
   Return
vk45 & Up Up::Send, {vk68 Up}

~vk45 & Down::
   If GetKeyState("Shift", "P")
      Send, {vk65 Down}
   Return
vk45 & Down Up::Send, {vk65 Up}

~vk45 & Left::
   If GetKeyState("Shift", "P")
      Send, {vk64 Down}
   Return
vk45 & Left Up::Send, {vk64 Up}

~vk45 & Right::
   If GetKeyState("Shift", "P")
      Send, {vk66 Down}
   Return
vk45 & Right Up::Send, {vk66 Up}

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

10

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Grey пишет:
Twente пишет:

...в обычной среде (в блокноте, например) скрипт работает так, как необходимо

Twente пишет:

Вот, что получается теперь в приложении:
Стрелки переназначаются
на num4, num5, num 6, num8 соотвественно

Twente пишет:

3) "по умолчанию" стрелки не переназначаются на другие клавиши;   --- не работает...

Вы перечите самому себе.

Возможно, но скорее неправильно формулирую. Я исправил "приложение" на "полноэкранное приложение" - т.е. игра.

Итак, необходимые уточненные функции скрипта в полноэкранном приложении:

1) Переназначить клавишу "С" на клавишу "Пробел" в одностороннем порядке. 

2) Переназначить клавишу"Пробел" на "LCTRL".

3) Если нажата клавиша "Пробел" (Физическая), то "Стрелка вверх" заменяется на Num8, "Стрелка вниз" заменяется на Num5 и другие стрелки на num соответственно.

4) Если клавиша "Пробел" (Физическая) не нажата, то "Стрелка вверх" это "Стрелка вверх", "Стрелка влево" это "Стрелка влево" и другие стрелки соответсвенно.

5) Переназначение комбинации: "Shift + Стрелка вверх, вниз, влево, вправо"на "Num8", "Num5", "Num4", "Num6".
                                               
6) Переназначение комбинации:       "Стрелка вверх      + Shift "         на "Num8".
                                                     [Удерживается]     [Нажимается]

7) Переназначение комбинации  "(E + стрелка вверх)    +   Shift"         на "Num8",
                                               [Удерживаются вместе]  [Нажимается]

  а также переназначение других аналогичных комбинаций в зависимости от направления соотвественно (num6, num4, num5).


Вот, что я наблюдаю при тесте вашего свежего скрипта в полноэкранном приложении (игре):

1) Работает

2) Работает

3) Работает

4) Не работает - независимо от клавиши "Пробел", "Стрелка вверх, влево, вправо" заменяется на Num8, Num4, Num6 соотвественно. Клавиша "Стрелка вниз" не работает. Если удерживать пробел и нажать клавишу "Стрелка вниз", то посылается Num5, как и необходимо.

5) - 7) неизвестно из-за пункта 4).

Вот так, надеюсь все понятно?:)

Grey пишет:

Второй вариант концовки предыдущего скрипта:

~vk45 & Up:: ; e
   If GetKeyState("Shift", "P")
      Send, {vk68 Down}
   Return
vk45 & Up Up::Send, {vk68 Up}

~vk45 & Down::
   If GetKeyState("Shift", "P")
      Send, {vk65 Down}
   Return
vk45 & Down Up::Send, {vk65 Up}

~vk45 & Left::
   If GetKeyState("Shift", "P")
      Send, {vk64 Down}
   Return
vk45 & Left Up::Send, {vk64 Up}

~vk45 & Right::
   If GetKeyState("Shift", "P")
      Send, {vk66 Down}
   Return
vk45 & Right Up::Send, {vk66 Up}

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

Это не нужно, насколько я понимаю.

11

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente пишет:

1) Переназначить клавишу "С" на клавишу "Пробел" в одностороннем порядке.

Space::
   Send, {vk43 Down} ; c
   KeyWait, Space
   Send, {vk43 Up}
   Return
Twente пишет:

2) Переназначить клавишу"Пробел" на "LCTRL".

LCtrl::
   Send, {Space Down}
   KeyWait, LCtrl
   Send, {Space Up}
   Return
Twente пишет:

3) Если нажата клавиша "Пробел" (Физическая), то "Стрелка вверх" заменяется на Num8, "Стрелка вниз" заменяется на Num5 и другие стрелки на num соответственно.
4) Если клавиша "Пробел" (Физическая) не нажата, то "Стрелка вверх" это "Стрелка вверх", "Стрелка влево" это "Стрелка влево" и другие стрелки соответсвенно.
6) Переназначение комбинации:       "Стрелка вверх      + Shift "         на "Num8".
                                                     [Удерживается]     [Нажимается]

Up::
   If GetKeyState("Space", "P")
      {
         Send, {vk68 Down}
         KeyWait, Up
         Send, {vk68 Up}
         Return
      }
   Send, {vk26 Down}
   While GetKeyState("Up", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               Send, {vk26 Up}{vk68 Down}
               KeyWait, Shift
               Send, {vk68 Up}
               Return
            }
      }
   Send, {vk26 Up}
   Return

Down::
   If GetKeyState("Space", "P")
      {
         Send, {vk65 Down}
         KeyWait, Down
         Send, {vk65 Up}
         Return
      }
   Send, {vk28 Down}
   While GetKeyState("Down", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               Send, {vk28 Up}{vk65 Down}
               KeyWait, Shift
               Send, {vk65 Up}
               Return
            }
      }
   Send, {vk28 Up}
   Return

Left::
   If GetKeyState("Space", "P")
      {
         Send, {vk64 Down}
         KeyWait, Left
         Send, {vk64 Up}
         Return
      }
   Send, {vk25 Down}
   While GetKeyState("Left", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               Send, {vk25 Up}{vk64 Down}
               KeyWait, Shift
               Send, {vk64 Up}
               Return
            }
      }
   Send, {vk25 Up}
   Return

Right::
   If GetKeyState("Space", "P")
      {
         Send, {vk66 Down}
         KeyWait, Right
         Send, {vk66 Up}
         Return
      }
   Send, {vk27 Down}
   While GetKeyState("Right", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               Send, {vk27 Up}{vk66 Down}
               KeyWait, Shift
               Send, {vk66 Up}
               Return
            }
      }
   Send, {vk27 Up}
   Return
Twente пишет:

5) Переназначение комбинации: "Shift + Стрелка вверх, вниз, влево, вправо"на "Num8", "Num5", "Num4", "Num6".

Shift & Up::Send, {vk68 Down}
Shift & Up Up::Send, {vk68 Up}

Shift & Down::Send, {vk65 Down}
Shift & Down Up::Send, {vk65 Up}

Shift & Left::Send, {vk64 Down}
Shift & Left Up::Send, {vk64 Up}

Shift & Right::Send, {vk66 Down}
Shift & Right Up::Send, {vk66 Up}
Twente пишет:

7) Переназначение комбинации  "(E + стрелка вверх)    +   Shift"         на "Num8",
                                               [Удерживаются вместе]  [Нажимается]
  а также переназначение других аналогичных комбинаций в зависимости от направления соотвественно (num6, num4, num5).

~vk45 & Up:: ; e
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            Send, {vk68 Down}
      }
   Return
vk45 & Up Up::Send, {vk68 Up}

~vk45 & Down::
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            Send, {vk65 Down}
      }
   Return
vk45 & Down Up::Send, {vk65 Up}

~vk45 & Left::
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            Send, {vk64 Down}
      }
   Return
vk45 & Left Up::Send, {vk64 Up}

~vk45 & Right::
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            Send, {vk66 Down}
      }
   Return
vk45 & Right Up::Send, {vk66 Up}

В итоге:

#UseHook
SendMode, Input
Return

Space::
   Send, {vk43 Down} ; c
   KeyWait, Space
   Send, {vk43 Up}
   Return

LCtrl::
   Send, {Space Down}
   KeyWait, LCtrl
   Send, {Space Up}
   Return

Up::
   If GetKeyState("Space", "P")
      {
         Send, {vk68 Down}
         KeyWait, Up
         Send, {vk68 Up}
         Return
      }
   Send, {vk26 Down}
   While GetKeyState("Up", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               Send, {vk26 Up}{vk68 Down}
               KeyWait, Shift
               Send, {vk68 Up}
               Return
            }
      }
   Send, {vk26 Up}
   Return

Down::
   If GetKeyState("Space", "P")
      {
         Send, {vk65 Down}
         KeyWait, Down
         Send, {vk65 Up}
         Return
      }
   Send, {vk28 Down}
   While GetKeyState("Down", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               Send, {vk28 Up}{vk65 Down}
               KeyWait, Shift
               Send, {vk65 Up}
               Return
            }
      }
   Send, {vk28 Up}
   Return

Left::
   If GetKeyState("Space", "P")
      {
         Send, {vk64 Down}
         KeyWait, Left
         Send, {vk64 Up}
         Return
      }
   Send, {vk25 Down}
   While GetKeyState("Left", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               Send, {vk25 Up}{vk64 Down}
               KeyWait, Shift
               Send, {vk64 Up}
               Return
            }
      }
   Send, {vk25 Up}
   Return

Right::
   If GetKeyState("Space", "P")
      {
         Send, {vk66 Down}
         KeyWait, Right
         Send, {vk66 Up}
         Return
      }
   Send, {vk27 Down}
   While GetKeyState("Right", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               Send, {vk27 Up}{vk66 Down}
               KeyWait, Shift
               Send, {vk66 Up}
               Return
            }
      }
   Send, {vk27 Up}
   Return

Shift & Up::Send, {vk68 Down}
Shift & Up Up::Send, {vk68 Up}

Shift & Down::Send, {vk65 Down}
Shift & Down Up::Send, {vk65 Up}

Shift & Left::Send, {vk64 Down}
Shift & Left Up::Send, {vk64 Up}

Shift & Right::Send, {vk66 Down}
Shift & Right Up::Send, {vk66 Up}

~vk45 & Up:: ; e
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            Send, {vk68 Down}
      }
   Return
vk45 & Up Up::Send, {vk68 Up}

~vk45 & Down::
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            Send, {vk65 Down}
      }
   Return
vk45 & Down Up::Send, {vk65 Up}

~vk45 & Left::
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            Send, {vk64 Down}
      }
   Return
vk45 & Left Up::Send, {vk64 Up}

~vk45 & Right::
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If GetKeyState("Shift", "P")
            Send, {vk66 Down}
      }
   Return
vk45 & Right Up::Send, {vk66 Up}

Проверьте скрипт вне целевого приложения, у меня в Notepad/Notepad GNU работает. Если перед строкой с директивой #UseHook пропишите директиву #IfWinActive с правильными параметрами Вашего приложения, то это не помешает . В качестве эксперимента запустите код после самого приложения.

12 (изменено: Twente, 2011-05-12 18:38:38)

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Grey пишет:

Проверьте скрипт вне целевого приложения, у меня в Notepad/Notepad GNU работает.

Проверял в Notepad, скрипт работает, однако вот что подметил:

Twente пишет:

3) Если нажата клавиша "Пробел" (Физическая), то "Стрелка вверх" заменяется на Num8, "Стрелка вниз" заменяется на Num5 и другие стрелки на num соответственно.

Если удерживать "Пробел + Стрелка вверх" то посылается один раз "Num8" и все, а надо, чтобы посылалось повторение "Num8",  пока нажата "Стрелка вверх".

Twente пишет:

4) Если клавиша "Пробел" (Физическая) не нажата, то "Стрелка вверх" это "Стрелка вверх", "Стрелка влево" это "Стрелка влево" и другие стрелки соответсвенно.

Аналогично: если удерживать "стрелку вверх" то посылается один раз "стрелка верх", а надо, чтобы посылалось повторение "Стрелка вверх", пока не не отпустить клавишу "Стрелка вверх".

Twente пишет:

6) Переназначение комбинации:       "Стрелка вверх      + Shift "         на "Num8".
                                                                             [Удерживается]     [Нажимается]

Удерживая "стрелку вверх", нажимаю затем "Shift" - посылается Num8. А вот если нажать еще раз "Shift", не отпуская стрелку вверх, то Num8 не посылается. Необходимо, чтобы Num8 посылалось и в этом случае.

Twente пишет:

7) Переназначение комбинации  "(E + стрелка вверх)    +   Shift"         на "Num8",
                                                                      [Удерживаются вместе]  [Нажимается]

  а также переназначение других аналогичных комбинаций в зависимости от направления соотвественно (num6, num4, num5).

Работает некорректно. При комбинации Е+стрелка вверх+Shift посылает 3 раза Num.

Grey пишет:

Если перед строкой с директивой #UseHook пропишите директиву #IfWinActive с правильными параметрами Вашего приложения, то это не помешает . В качестве эксперимента запустите код после самого приложения.

Добавил перед строкой #UseHook директиву #IfWinActive ahk_class FIFANG - ahk посмотрел через AU3_Spy. Действительно полезная вещь! Теперь скрипт работает только в игре. Если удастся обеспечить выполнение всех необходимых функций скрипта в игре, то можно, как мне кажется, использовать этот параметр, как условие для "автозакрытия скрипта".
Но самое главное, что и после добавления вышеуказанной директивы, по-прежнему нужные функции в игре не выполняются, а наблюдается те же проблемы, что я описал в предыдущем посте.
На мой делетанский:) взгляд, целевое приложение (игра) может блокировать какие-то функции скрипта, из-за чего нарушается его функциональность. Поэтому, возможно, необходимо использовать другие методы выполнения нужных функций.

Twente пишет:

5) Переназначение комбинации: "Shift + Стрелка вверх, вниз, влево, вправо"на "Num8", "Num5", "Num4", "Num6".

Изначально, прочитав справку,  я использовал для выполнения этой функции вот такой простейший код:

+SC014D::SC04D
+SC014B::SC04B
+SC150::SC04C
+SC148::SC048

И если не считать иногда происходящих "залипаний", все работало в игре отлично. Вопрос: можно ли реализовать переназначение на "Пробел" нажатия/удерживания физической клавиши "С" и "виртуальной" "Shift", которая нажимается для посылания "Num 4-8" в коде выше?

13

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

#UseHook
SendMode, Input
Return

LCtrl::
   Send, {Space Down}
   KeyWait, LCtrl
   Send, {Space Up}
   Return

Space::
   Send, {vk43 Down} ; c
   While GetKeyState("Space", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {vk68}
         If replace_down = 1
            Send, {vk65}
         If replace_left = 1
            Send, {vk64}
         If replace_right = 1
            Send, {vk66}
      }
   KeyWait, Space
   Send, {vk43 Up}
   Return

vk45 :: ; e
   Send, {vk45 Down}
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {vk68}
         If replace_down = 1
            Send, {vk65}
         If replace_left = 1
            Send, {vk64}
         If replace_right = 1
            Send, {vk66}
      }
   KeyWait, vk45
   Send, {vk45 Up}
   Return

Up::
   replace_up := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Up", "P")
            {
               Send, {vk68}
               Sleep, 30
            }
      }
   While GetKeyState("Up", "P")
      {
         Send, {vk26}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk68}
                     Sleep, 30
                  }
            }
      }
   replace_up := 0
   Return

Down::
   replace_down := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Down", "P")
            {
               Send, {vk65}
               Sleep, 30
            }
      }
   While GetKeyState("Down", "P")
      {
         Send, {vk28}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk65}
                     Sleep, 30
                  }
            }
      }
   replace_down := 0
   Return

Left::
   replace_left := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Left", "P")
            {
               Send, {vk64}
               Sleep, 30
            }
      }
   While GetKeyState("Left", "P")
      {
         Send, {vk25}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk64}
                     Sleep, 30
                  }
            }
      }
   replace_left := 0
   Return

Right::
   replace_right := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Right", "P")
            {
               Send, {vk66}
               Sleep, 30
            }
      }
   While GetKeyState("Right", "P")
      {
         Send, {vk27}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk66}
                     Sleep, 30
                  }
            }
      }
   replace_right := 0
   Return

Shift & Up::
   While GetKeyState("Up", "P")
      {
         Send, {vk68}
         Sleep, 30
      }
   Return
Shift & Up Up::Return

Shift & Down::
   While GetKeyState("Down", "P")
      {
         Send, {vk65}
         Sleep, 30
      }
   Return
Shift & Down Up::Return

Shift & Left::
   While GetKeyState("Left", "P")
      {
         Send, {vk64}
         Sleep, 30
      }
   Return
Shift & Left Up::Return

Shift & Right::
   While GetKeyState("Right", "P")
      {
         Send, {vk66}
         Sleep, 30
      }
   Return
Shift & Right Up::Return

Другой пример оформления хоткея (на пример клавиши Е):

~vk45 :: ; e
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {vk68}
         If replace_down = 1
            Send, {vk65}
         If replace_left = 1
            Send, {vk64}
         If replace_right = 1
            Send, {vk66}
      }
   Return
vk45 Up::Return

Опробуйте оба способа, чтобы понять разницу и выбрать наиболее подходящий вариант.

14

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Grey пишет:
#UseHook
SendMode, Input
Return

LCtrl::
   Send, {Space Down}
   KeyWait, LCtrl
   Send, {Space Up}
   Return

Space::
   Send, {vk43 Down} ; c
   While GetKeyState("Space", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {vk68}
         If replace_down = 1
            Send, {vk65}
         If replace_left = 1
            Send, {vk64}
         If replace_right = 1
            Send, {vk66}
      }
   KeyWait, Space
   Send, {vk43 Up}
   Return

vk45 :: ; e
   Send, {vk45 Down}
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {vk68}
         If replace_down = 1
            Send, {vk65}
         If replace_left = 1
            Send, {vk64}
         If replace_right = 1
            Send, {vk66}
      }
   KeyWait, vk45
   Send, {vk45 Up}
   Return

Up::
   replace_up := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Up", "P")
            {
               Send, {vk68}
               Sleep, 30
            }
      }
   While GetKeyState("Up", "P")
      {
         Send, {vk26}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk68}
                     Sleep, 30
                  }
            }
      }
   replace_up := 0
   Return

Down::
   replace_down := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Down", "P")
            {
               Send, {vk65}
               Sleep, 30
            }
      }
   While GetKeyState("Down", "P")
      {
         Send, {vk28}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk65}
                     Sleep, 30
                  }
            }
      }
   replace_down := 0
   Return

Left::
   replace_left := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Left", "P")
            {
               Send, {vk64}
               Sleep, 30
            }
      }
   While GetKeyState("Left", "P")
      {
         Send, {vk25}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk64}
                     Sleep, 30
                  }
            }
      }
   replace_left := 0
   Return

Right::
   replace_right := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Right", "P")
            {
               Send, {vk66}
               Sleep, 30
            }
      }
   While GetKeyState("Right", "P")
      {
         Send, {vk27}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk66}
                     Sleep, 30
                  }
            }
      }
   replace_right := 0
   Return

Shift & Up::
   While GetKeyState("Up", "P")
      {
         Send, {vk68}
         Sleep, 30
      }
   Return
Shift & Up Up::Return

Shift & Down::
   While GetKeyState("Down", "P")
      {
         Send, {vk65}
         Sleep, 30
      }
   Return
Shift & Down Up::Return

Shift & Left::
   While GetKeyState("Left", "P")
      {
         Send, {vk64}
         Sleep, 30
      }
   Return
Shift & Left Up::Return

Shift & Right::
   While GetKeyState("Right", "P")
      {
         Send, {vk66}
         Sleep, 30
      }
   Return
Shift & Right Up::Return

Другой пример оформления хоткея (на пример клавиши Е):

~vk45 :: ; e
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {vk68}
         If replace_down = 1
            Send, {vk65}
         If replace_left = 1
            Send, {vk64}
         If replace_right = 1
            Send, {vk66}
      }
   Return
vk45 Up::Return

Опробуйте оба способа, чтобы понять разницу и выбрать наиболее подходящий вариант.

Непонимаю. А где именно 1 пример переназначения? E переназначается на что? Что значит {vk65}?

15

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente пишет:

Непонимаю. А где именно 1 пример переназначения? E переназначается на что?

Вообще-то я писал об:

Grey пишет:

Другой пример оформления хоткея (на пример клавиши Е)

вариант №1

; взят из основного скрипта
vk45 :: ; e
   Send, {vk45 Down}
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {vk68}
         If replace_down = 1
            Send, {vk65}
         If replace_left = 1
            Send, {vk64}
         If replace_right = 1
            Send, {vk66}
      }
   KeyWait, vk45
   Send, {vk45 Up}
   Return

вариант №2

~vk45 :: ; e
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {vk68}
         If replace_down = 1
            Send, {vk65}
         If replace_left = 1
            Send, {vk64}
         If replace_right = 1
            Send, {vk66}
      }
   Return
vk45 Up::Return
Twente пишет:

Что значит {vk65}?

Виртуальный код клавиши Num 5.

16 (изменено: Twente, 2011-05-15 23:50:35)

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Grey пишет:

Другой пример оформления хоткея (на пример клавиши Е)

И какое действие должно происходить при нажатии "E"?   Не могли бы вы расшифровать этот код? При тесте в notepad я ничего не наблюдаю при нажатии "Е".

17

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Для того чтобы не мешало глазам отбросим из обоих примеров это содержимое

   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {vk68}
         If replace_down = 1
            Send, {vk65}
         If replace_left = 1
            Send, {vk64}
         If replace_right = 1
            Send, {vk66}
      }

В обоих вариантах для наглядности изменим действие хоткея на отображение тултипа.
Первый вариант:

vk45:: ; при нажатии/удержании один раз загорается тултип, по прошествию 500мс он гаснет и более уже пока удерживается хоткей он не загорается
   ToolTip, нажата клавиша E
   Sleep, 500
   Tooltip
   KeyWait, vk45
   Return

Второй вариант:

vk45:: ; тут при нажатии/удержании хоткея постоянно загорается тултип
   ToolTip, нажата клавиша E
   Sleep, 500
   Tooltip
   Return
vk45 Up::Return

Теперь уберём тултип и назначим действие.
Первый вариант:

$vk45:: ; при нажатии/удержании нажимается клавиша Е, при отпускании - отжимается
   Send, {vk45 Down}
   KeyWait, vk45
   Send, {vk45 Up}
   Return

Второй вариант:

$vk45:: ; при нажатии/удержании постоянно посылается нажатие клавиши Е, при отпускании - отжимается
   Send, {vk45 Down}
   Return
vk45 Up::
   Send, {vk45 Up}
   Return

Альтернативное действие хоткея:
Первый вариант:

$vk45:: ; при нажатии/удержании посылается короткое нажатие клавиши Е
   Send, {vk45}
   KeyWait, vk45
;   Send, {vk45} ; можно добавить действие по отжатию
   Return

Второй вариант:

$vk45:: ; при нажатии/удержании постоянно посылаются короткие нажатия клавиши Е
   Send, {vk45}
   Return
vk45 Up::
;   Send, {vk45} ; можно добавить действие по отжатию
   Return

Я не пишу скрипт для себя, а посему не знаю как должны вести себя хоткеи (с автоповтором или без), по этому сразу предлагаю варианты, а уж какой подойдёт это Вам решать.

18

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

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

19

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente, не нужно цитировать весь предыдущий пост. Зачем превращать ветку в бесполезную простыню?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

20

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Принято

21

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente пишет:

Попробуйте протестировать скрипт (с различными вариантами хоткеев) в любой игре (Counter Strike например)...

Попробовал, у меня последний скрипт (в прочем как и ранее написаные) корректно работает не только в Notepad GNU, но и в Counter Strike: Source.

22

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Grey пишет:
Twente пишет:

Попробуйте протестировать скрипт (с различными вариантами хоткеев) в любой игре (Counter Strike например)...

Попробовал, у меня последний скрипт (в прочем как и ранее написаные) корректно работает не только в Notepad GNU, но и в Counter Strike: Source.

Я протестировал в Counter Strike 1.6 и наблюдал те же проблемы, что и в FIFA 11.
Я попробывал разные способы хоткеев, которые вы указали, но эта часть кода не работает:

vk45 :: ; e
   Send, {vk45 Down}
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {vk68}
         If replace_down = 1
            Send, {vk65}
         If replace_left = 1
            Send, {vk64}
         If replace_right = 1
            Send, {vk66}
      }
   KeyWait, vk45
   Send, {vk45 Up}
   Return
 
Up::
   replace_up := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Up", "P")
            {
               Send, {vk68}
               Sleep, 30
            }
      }
   While GetKeyState("Up", "P")
      {
         Send, {vk26}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk68}
                     Sleep, 30
                  }
            }
      }
   replace_up := 0
   Return
 
Down::
   replace_down := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Down", "P")
            {
               Send, {vk65}
               Sleep, 30
            }
      }
   While GetKeyState("Down", "P")
      {
         Send, {vk28}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk65}
                     Sleep, 30
                  }
            }
      }
   replace_down := 0
   Return
 
Left::
   replace_left := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Left", "P")
            {
               Send, {vk64}
               Sleep, 30
            }
      }
   While GetKeyState("Left", "P")
      {
         Send, {vk25}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk64}
                     Sleep, 30
                  }
            }
      }
   replace_left := 0
   Return
 
Right::
   replace_right := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Right", "P")
            {
               Send, {vk66}
               Sleep, 30
            }
      }
   While GetKeyState("Right", "P")
      {
         Send, {vk27}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {vk66}
                     Sleep, 30
                  }
            }
      }
   replace_right := 0
   Return
 
Shift & Up::
   While GetKeyState("Up", "P")
      {
         Send, {vk68}
         Sleep, 30
      }
   Return
Shift & Up Up::Return

23 (изменено: Grey, 2011-05-21 14:20:39)

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Скрипт надо было изначально делать использовав скэн коды, исправил - пробуем.

#IfWinActive ahk_class FIFANG
#UseHook
SendMode, Input
Return
 
LCtrl::
   Send, {Space Down}
   KeyWait, LCtrl
   Send, {Space Up}
   Return
 
Space::
   Send, {vk43 Down} ; c
   While GetKeyState("Space", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {sc48}
         If replace_down = 1
            Send, {sc4c}
         If replace_left = 1
            Send, {sc4b}
         If replace_right = 1
            Send, {sc4d}
      }
   KeyWait, Space
   Send, {vk43 Up}
   Return
 
vk45 :: ; e
   Send, {vk45 Down}
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If replace_up = 1
            Send, {sc48}
         If replace_down = 1
            Send, {sc4c}
         If replace_left = 1
            Send, {sc4b}
         If replace_right = 1
            Send, {sc4d}
      }
   KeyWait, vk45
   Send, {vk45 Up}
   Return
 
Up::
   replace_up := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Up", "P")
            {
               Send, {sc48}
               Sleep, 30
            }
      }
   While GetKeyState("Up", "P")
      {
         Send, {sc148}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {sc48}
                     Sleep, 30
                  }
            }
      }
   replace_up := 0
   Return
 
Down::
   replace_down := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Down", "P")
            {
               Send, {sc4c}
               Sleep, 30
            }
      }
   While GetKeyState("Down", "P")
      {
         Send, {sc150}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {sc4c}
                     Sleep, 30
                  }
            }
      }
   replace_down := 0
   Return
 
Left::
   replace_left := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Left", "P")
            {
               Send, {sc4b}
               Sleep, 30
            }
      }
   While GetKeyState("Left", "P")
      {
         Send, {sc14b}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {sc4b}
                     Sleep, 30
                  }
            }
      }
   replace_left := 0
   Return
 
Right::
   replace_right := 1
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Right", "P")
            {
               Send, {sc4d}
               Sleep, 30
            }
      }
   While GetKeyState("Right", "P")
      {
         Send, {sc14d}
         Sleep, 30
         If GetKeyState("Shift", "P")
            {
               While GetKeyState("Shift", "P")
                  {
                     Send, {sc4d}
                     Sleep, 30
                  }
            }
      }
   replace_right := 0
   Return
 
Shift & Up::
   While GetKeyState("Up", "P")
      {
         Send, {sc48}
         Sleep, 30
      }
   Return
Shift & Up Up::Return
 
Shift & Down::
   While GetKeyState("Down", "P")
      {
         Send, {sc4c}
         Sleep, 30
      }
   Return
Shift & Down Up::Return
 
Shift & Left::
   While GetKeyState("Left", "P")
      {
         Send, {sc4b}
         Sleep, 30
      }
   Return
Shift & Left Up::Return
 
Shift & Right::
   While GetKeyState("Right", "P")
      {
         Send, {sc4d}
         Sleep, 30
      }
   Return
Shift & Right Up::Return

24

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Grey пишет:

Скрипт надо было изначально делать использовав скэн коды, исправил - пробуем.

Попробывал - ни одна функция не работает, кроме Ctrl и Space!:(

Попробую собрать, что работает...

Twente пишет:

Итак, необходимые уточненные функции скрипта в полноэкранном приложении:

1) Переназначить клавишу "С" на клавишу "Пробел" в одностороннем порядке. 

2) Переназначить клавишу"Пробел" на "LCTRL".

Код:

#IfWinActive ahk_class FIFANG
#UseHook
SendMode, Input
Return

Space::
   Send, {vk43 Down} ; c
   KeyWait, Space
   Send, {vk43 Up}
   Return

LCtrl::
   Send, {Space Down}
   KeyWait, LCtrl
   Send, {Space Up}
   Return
Twente пишет:

5) Переназначение комбинации: "Shift + Стрелка вверх, вниз, влево, вправо"на "Num8", "Num5", "Num4", "Num6".
                                               
6) Переназначение комбинации:       "Стрелка вверх      + Shift "         на "Num8".
                                                     [Удерживается]     [Нажимается]

Вот этот простейший код работает прекрасно:

#IfWinActive ahk_class FIFANG
#UseHook
SendMode, Input
Return

Shift & Up::Send, {vk68 Down}
Shift & Up Up::Send, {vk68 Up}

Shift & Down::Send, {vk65 Down}
Shift & Down Up::Send, {vk65 Up}

Shift & Left::Send, {vk64 Down}
Shift & Left Up::Send, {vk64 Up}

Shift & Right::Send, {vk66 Down}
Shift & Right Up::Send, {vk66 Up}

Попробывал вот такой код для функции 6 (только вверх):

Up & Shift::Send, {vk68 Down}
Up & Shift Up::Send, {vk68 Up}

При удержании стрелки вверх и нажатии Shift посылается Num8, как и необходимо, но "стрелка вверх" не работает (не посылает ничего при нажатии). Можно ли решить эту проблему?
Есть ли любые другие способы выполнения функций 3, 4, 7?

25

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente пишет:

...ни одна функция не работает, кроме Ctrl и Space!

Тогда будем отлаживать фокусируясь только на одном хоткее, в коде приведённом ниже действия от ранее вышеуказанных условий, только сами действия я заменил на информативные тултипы, и всё касаемо только одной клавиши - ВВЕРХ. Ваша задача проверить работоспособность при всех условиях:

Twente пишет:

3) Если нажата клавиша "Пробел" (Физическая), то "Стрелка вверх" заменяется на Num8...

Twente пишет:

4) Если клавиша "Пробел" (Физическая) не нажата, то "Стрелка вверх" это "Стрелка вверх"...

Twente пишет:

5) Переназначение комбинации: "Shift + Стрелка вверх,... на "Num8",...

Twente пишет:

6) Переназначение комбинации: "Стрелка вверх + Shift" на "Num8".

Twente пишет:

7) Переназначение комбинации "(E + стрелка вверх) + Shift" на "Num8",...

Twente пишет:

Если удерживать "Пробел + Стрелка вверх" то посылается один раз "Num8" и все, а надо, чтобы посылалось повторение "Num8", пока нажата "Стрелка вверх".

Twente пишет:

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

Twente пишет:

Удерживая "стрелку вверх", нажимаю затем "Shift" - посылается Num8. А вот если нажать еще раз "Shift", не отпуская стрелку вверх, то Num8 не посылается. Необходимо, чтобы Num8 посылалось и в этом случае.

Twente пишет:

Работает некорректно. При комбинации Е+стрелка вверх+Shift посылает 3 раза Num.

*Up::
shift_pressed_up:
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Space", "P")
            {
               ToolTip, при нажатой клавише Space - нажамается клавиша ЦИФРОВАЯ ВВЕРХ
               Sleep, 500
               ToolTip
            }
         If GetKeyState("Up", "P")
            {
               Gosub, pressed_up
            }
      }
space_pressed_up:
   If GetKeyState("Shift", "P")
      {
         While GetKeyState("Shift", "P")
            {
               ToolTip, при нажатой клавише Shift - нажамается клавиша ЦИФРОВАЯ ВВЕРХ
               Sleep, 500
               ToolTip
            }
         If GetKeyState("Up", "P")
            {
               Gosub, pressed_up
            }
      }
e_pressed_up:
   If GetKeyState("sc12", "P") ; e
      {
         While GetKeyState("Up", "P")
            {
               ToolTip, нажата клавиша ВВЕРХ
               Sleep, 500
               ToolTip
               If GetKeyState("Shift", "P")
                  {
                     While GetKeyState("Shift", "P")
                        {
                           ToolTip, при нажатых клавишах E+ВВЕРХ и Shift - нажамается клавиша ЦИФРОВАЯ ВВЕРХ
                           Sleep, 500
                           ToolTip
                        }
                     If GetKeyState("Up", "P")
                        {
                           Gosub, pressed_up
                        }
                  }
            }
         If GetKeyState("Up", "P")
            {
               Gosub, pressed_up
            }
      }
pressed_up:
   While GetKeyState("Up", "P")
      {
         ToolTip, нажата клавиша ВВЕРХ
         Sleep, 500
         ToolTip
         If GetKeyState("Space", "P")
            {
               Gosub, shift_pressed_up
            }
         If GetKeyState("Shift", "P")
            {
               Gosub, space_pressed_up
            }
         If GetKeyState("sc12", "P")
            {
               Gosub, e_pressed_up
            }
      }
   Return
Twente пишет:
Up & Shift::Send, {vk68 Down}
Up & Shift Up::Send, {vk68 Up}

При удержании стрелки вверх и нажатии Shift посылается Num8, как и необходимо, но "стрелка вверх" не работает (не посылает ничего при нажатии). Можно ли решить эту проблему?

Up & Shift::Send, {sc148 Down}{sc48 Down}
Up & Shift Up::Send, {sc148 Up}{sc48 Up}

26

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

1. Я нашел интересный патч для игры, который позволяет запускать игру в оконном режиме - это выглядит забавно. Попробывал предыдущие скрипты, предполагая, что возможно, "блокировка" происходит из-за полноэкранного режима, однако ничего не поменялось и в оконном режиме.
2. Еще одна деталь, которая возможно поможет:
В программе hotkeyboard pro я записывал нажатия клавиш в макрос. Я заметил что нажатие Up определяется как нажатие "Up (Расширенная клавиша)" в отличие от других клавиш (не расширенные).
3.

Grey пишет:
Up & Shift::Send, {sc148 Down}{sc48 Down}
Up & Shift Up::Send, {sc148 Up}{sc48 Up}

В целевом приложении Up не посылает ничего при нажатии/удержании. Up + Shift посылает Num8. Увы.
4.

Grey пишет:

Тогда будем отлаживать фокусируясь только на одном хоткее, в коде приведённом ниже действия от ранее вышеуказанных условий, только сами действия я заменил на информативные тултипы, и всё касаемо только одной клавиши - ВВЕРХ. Ваша задача проверить работоспособность при всех условиях:

Хорошая идея!
Проверка в notepad:
Примечание: изменил текст тултипов на английский, т.к. иначе отображается квадраты заместо символов.
1. Попробывал Space + Up - Появляется тултип 1: при нажатой клавише Space - нажимается клавиша ЦИФРОВАЯ ВВЕРХ - верно
2. Попробывал Shift + Up - Появляется тултип 2: при нажатой клавише Shift - нажимается клавиша ЦИФРОВАЯ ВВЕРХ - верно
3. Попробывал Up - Появляется тултип 5: нажата клавиша ВВЕРХ - все верно
4. Попробывал Up + Shift (нажимается вместе) - Появляется тултип 2: при нажатой клавише Shift - нажимается клавиша ЦИФРОВАЯ ВВЕРХ - верно.
5. Попробывал Up (удерживается) + Shift (нажимается быстро без задержки) - появляется и остается Тултип 5: нажата клавиша ВВЕРХ - не корректно.
6. Попробывал Up (удерживается) + Shift (нажимается с небольшой задержкой) - Появляется сначала тултип 5, потом тултип 2.
Необходимо так:
       "           Стрелка вверх                              Shift             "        посылание Num8
       [Удерживается или нажимается]  [Нажимается коротко]
7. Попробывал (E + стрелка вверх)    +   Shift"     
                   [Удерживаются вместе]  [Нажимается]

Тултип 4: "при нажатых клавишах E+ВВЕРХ и Shift - нажамается клавиша ЦИФРОВАЯ ВВЕРХ" появляется только при удержании Shift, а необходимо, чтобы ЦИФРОВАЯ ВВЕРХ посылалось даже при самом коротком нажатии.

Проверка в целевом приложении (в полноэкранном режиме и в режиме окна:
Все абсолютно аналогично. Значит проблема именно в посылании нажатий клавиш в целевом приложении?

27

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente пишет:

В программе hotkeyboard pro... ...нажатие Up определяется как нажатие "Up (Расширенная клавиша)" в отличие от других клавиш (не расширенные).

Нажатие клаиши Up на цифровой клавиатуре определяется как Up не расширеная (Hot Keyboard Pro 3.2.603).

Up & Shift::Send, {sc148 Down}{sc48 Down}
Up & Shift Up::Send, {sc148 Up}{sc48 Up}
Twente пишет:

В целевом приложении Up не посылает ничего при нажатии/удержании.

Дополнив код выше тильдой (~) перед Up & Shift::Send, {sc148 Down}{sc48 Down}, клавиша Up уже не подавляется AHK.

Twente пишет:

Up + Shift посылает Num8. Увы.

У меня посылает Up + нажатие Up на цифровой клавиатуре (Counter Strike: Source).

Twente пишет:

5. Попробывал Up (удерживается) + Shift (нажимается быстро без задержки) - появляется и остается Тултип 5: нажата клавиша ВВЕРХ - не корректно.

А с чего ему (тултип нажата клавиша ВВЕРХ) не появиться?, ведь клавиша Up нажата и удерживается, а шифт нажамается так быстро, что тултип от него просто не успевает отобразиться, к примеру если изменить значение в коде Sleep, 500 на меньшее эффект будет другой, это значение (500мс) выставлено специально, чтобы можно без напрягов успеть прочитать информацию в тултипе.

Twente пишет:

6. Попробывал Up (удерживается) + Shift (нажимается с небольшой задержкой) - Появляется сначала тултип 5, потом тултип 2.
Необходимо так:
       "           Стрелка вверх...

Правильно, клавиша UP нажимается перед шифтом, поэтому сначало тултип по нажатию клавиши вверх, а потом тултип от комбинации клавиш вверх + шифт.

Twente пишет:

...необходимо, чтобы ЦИФРОВАЯ ВВЕРХ посылалось даже при самом коротком нажатии.

Меняем значение Sleep, 500 на менешее (не рекомендую меньше 30мс), и вуаля.

Twente пишет:

Проверка в целевом приложении (в полноэкранном режиме и в режиме окна:
Все абсолютно аналогично...

Вот так ещё не проверялось в целевом приложении.

*Up::
shift_pressed_up:
   If GetKeyState("Space", "P")
      {
         While GetKeyState("Space", "P")
            {
               Send, {sc48}
               Sleep, 30
            }
         If GetKeyState("Up", "P")
            {
               Gosub, pressed_up
            }
      }
space_pressed_up:
   If GetKeyState("Shift", "P")
      {
         While GetKeyState("Shift", "P")
            {
               Send, {sc48}{sc148}
               Sleep, 30
            }
         If GetKeyState("Up", "P")
            {
               Gosub, pressed_up
            }
      }
e_pressed_up:
   If GetKeyState("sc12", "P") ; e
      {
         While GetKeyState("Up", "P")
            {
               Send, {sc148}
               Sleep, 30
               If GetKeyState("Shift", "P")
                  {
                     While GetKeyState("Shift", "P")
                        {
                           Send, {sc48}
                           Sleep, 30
                        }
                     If GetKeyState("Up", "P")
                        {
                           Gosub, pressed_up
                        }
                  }
            }
         If GetKeyState("Up", "P")
            {
               Gosub, pressed_up
            }
      }
pressed_up:
   While GetKeyState("Up", "P")
      {
         Send, {sc148}
         Sleep, 30
         If GetKeyState("Space", "P")
            {
               Gosub, shift_pressed_up
            }
         If GetKeyState("Shift", "P")
            {
               Gosub, space_pressed_up
            }
         If GetKeyState("sc12", "P")
            {
               Gosub, e_pressed_up
            }
      }
   Return

28

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Grey пишет:

Нажатие клаиши Up на цифровой клавиатуре определяется как Up не расширеная (Hot Keyboard Pro 3.2.603).

Я же не буду врать! У меня определяется как Up расширенная (Hot Keyboard Pro 3.2.7). Другое дело, с чем это может быть связано.

Grey пишет:

Дополнив код выше тильдой (~) перед Up & Shift::Send, {sc148 Down}{sc48 Down}, клавиша Up уже не подавляется AHK.

Действительно работает в целевом приложении. Также работает и комбинация E + UP + Shift. Замечательно!

Grey пишет:

А с чего ему (тултип нажата клавиша ВВЕРХ) не появиться?, ведь клавиша Up нажата и удерживается, а шифт нажамается так быстро, что тултип от него просто не успевает отобразиться, к примеру если изменить значение в коде Sleep, 500 на меньшее эффект будет другой, это значение (500мс) выставлено специально, чтобы можно без напрягов успеть прочитать информацию в тултипе.
Правильно, клавиша UP нажимается перед шифтом, поэтому сначало тултип по нажатию клавиши вверх, а потом тултип от комбинации клавиш вверх + шифт.

Да, вы правы!

Grey пишет:

Вот так ещё не проверялось в целевом приложении. Код AHK...

Попробывал в целевом приложении. Ни одна функция не работает.
Остается решить только функцию с "пробелом".

29 (изменено: Grey, 2011-05-29 15:17:21)

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente пишет:

...с чем это может быть связано.

Не знаю, не уверен, что это имеет какое-либо влияние.

Twente пишет:

Ни одна функция не работает.

Я увы, в футбольные симуляторы не играю, но не думаю, что это такая игра, для которой разработчики встроили-бы защиту от прикладного программирования. Сам сталкивался, на пример в BF2, что на некоторые клавиши действие скрипта не распространялось. Хотя на тот момент багаж знаний по этому языку был не велик, м.б., что и не правильно делал.

Twente пишет:

Остается решить только функцию с "пробелом".

Поясните.

30 (изменено: Twente, 2011-06-03 22:33:39)

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Grey пишет:

Я увы, в футбольные симуляторы не играю, но не думаю, что это такая игра, для которой разработчики встроили-бы защиту от прикладного...

Согласен, маловероятно что есть какая-то защита.

Grey пишет:

Не знаю, не уверен, что это имеет какое-либо влияние.

Twente пишет:

Попробуйте протестировать скрипт (с различными вариантами хоткеев) в любой игре (Counter Strike например)...

Grey пишет:

Попробовал, у меня последний скрипт (в прочем как и ранее написаные) корректно работает не только в Notepad GNU, но и в Counter Strike: Source.

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

Twente пишет:

В программе hotkeyboard pro я записывал нажатия клавиш в макрос. Я заметил что нажатие Up определяется как нажатие "Up (Расширенная клавиша)

Grey пишет:

Нажатие клаиши Up на цифровой клавиатуре определяется как Up не расширеная (Hot Keyboard Pro 3.2.603).

Grey пишет:

Сам сталкивался, на пример в BF2, что на некоторые клавиши действие скрипта не распространялось.

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

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

Twente пишет:

Остается решить только функцию с "пробелом".

Собрал вот такой код:

#UseHook
#MaxHotkeysPerInterval 200
SendMode, Input
Return

Shift & Up::Send, {vk68 Down}
Shift & Up Up::Send, {vk68 Up}

~Up & Shift::Send, {sc48 Down}
Up & Shift Up::Send, {sc48 Up}

Shift & Right::Send, {vk66 Down}
Shift & Right Up::Send, {vk66 Up}

~Right & Shift::Send, {sc04D Down}
Right & Shift Up::Send, {sc04D Up}

~Left & Shift::Send, {sc04B Down}
Left & Shift Up::Send, {sc04B Up}

Shift & Left::Send, {vk64 Down}
Shift & Left Up::Send, {vk64 Up}

~Down & Shift::Send, {sc04C Down}
Down & Shift Up::Send, {sc04C Up}

Shift & Down::Send, {vk65 Down}
Shift & Down Up::Send, {vk65 Up}

В полноэкранном приложении (в.т.ч. в целевом приложении) данный скрипт полностью выполняет следующие функции:
5) Переназначение комбинации: "Shift + Стрелка вверх, вниз, влево, вправо"на "Num8", "Num5", "Num4", "Num6".                                             
6) Переназначение комбинации:       "Стрелка вверх      + Shift "         на "Num8".                                 
7) Переназначение комбинации  "(E + стрелка вверх)    +   Shift"         на "Num8",
Это уже какой-то результат!
Эти две функции пока не удалось реализовать:
3) Если нажата клавиша "Пробел" (Физическая), то "Стрелка вверх" заменяется на Num8, "Стрелка вниз" заменяется на Num5 и другие стрелки на num соответственно.
4) Если клавиша "Пробел" (Физическая) не нажата, то "Стрелка вверх" это "Стрелка вверх", "Стрелка влево" это "Стрелка влево" и другие стрелки соответсвенно.

31

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente пишет:

...данный скрипт полностью выполняет следующие функции: ...7) Переназначение комбинации  "(E + стрелка вверх) + Shift" на "Num8"

Такой комбинации клавиш нет в данном коде.

Twente пишет:

Эти две функции пока не удалось реализовать:
3) Если нажата клавиша "Пробел" (Физическая), то "Стрелка вверх" заменяется на Num8...
4) Если клавиша "Пробел" (Физическая) не нажата, то "Стрелка вверх" это "Стрелка вверх"...

Собственно не понятно, почему тотже код только без тултипов уже не работает?

Twente пишет:

...1. Попробывал Space + Up - Появляется тултип 1: при нажатой клавише Space - нажимается клавиша ЦИФРОВАЯ ВВЕРХ - верно...
3. Попробывал Up - Появляется тултип 5: нажата клавиша ВВЕРХ - все верно

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

32 (изменено: Twente, 2011-06-15 17:43:08)

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Grey пишет:
Twente пишет:

...данный скрипт полностью выполняет следующие функции: ...7) Переназначение комбинации  "(E + стрелка вверх) + Shift" на "Num8"

Такой комбинации клавиш нет в данном коде.

Не важно, главное требуемая функция выполняется

Grey пишет:

Собственно не понятно, почему тотже код только без тултипов уже не работает?

Неизвестно, оставим это. Я выяснил, что при выполнении этих функций появится много других различных проблем.

Grey пишет:

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

Да я все понимаю, огромное спасибо вам за бескорыстную помощь!
Есть 3 конкретных вопроса:
1) Как реализовать функцию автозавершения скрипта в зависимости от активности приложения:
#IfWinActive ahk_class FIFANG
2)

~Up & Shift::Send, {sc48 Down}
Up & Shift Up::Send, {sc48 Up}
~Left & Shift::Send, {sc04B Down}
Left & Shift Up::Send, {sc04B Up}

При нажатии, например, Up + Left (Вместе) + Shift, посылает только Num8. Можно ли реализовать при нажатии такой комбинации посылание Num8 + Num4 вместе, так как это происходит в коде:

Shift & Up::Send, {vk68 Down}
Shift & Up Up::Send, {vk68 Up}
Shift & Left::Send, {vk64 Down}
Shift & Left Up::Send, {vk64 Up}

3) Как правильно составлять синтакис комбинации из трех или более горячих клавиш, например Shift + Up + Space?
И еще один неконкретнный вопрос:
Каким образом можно бороться с залипаниями "виртуальных" (Посланных скриптом) и физических клавиш, происходящих при использовании скрипта.
P.S. Особенно важен вопрос 2!!! Заранее большое спасибо вам за помощь!!

33

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Twente пишет:

1) Как реализовать функцию автозавершения скрипта в зависимости от активности приложения...

Видимо с запуском скрипта нужно запустить таймер для проверки активности приложения

#IfWinActive ahk_class FIFANG
#UseHook
DetectHiddenWindows, On
SendMode, Input
SetTimer, close_app, 5000 ; любое значение интервала, в данном случае 5 секунд
Return

, создать метку на которую будет переход таймера по заданному интервалу времени.

; вариант 1 - отслеживание окна
close_app:
   IfWinNotExist, ahk_class FIFANG
      ExitApp
; вариант 2 - отслеживание процесса
close_app:
   Process, Exist, ; тут название запускного файла (*.ехе)
   If ErrorLevel = 0
      ExitApp

Метку расположить где угодно, после первого Return'а

Twente пишет:

При нажатии, например, Up + Left (Вместе) + Shift, посылает только Num8.

А так,

~Left & Shift::Send, {sc04B Down}
Left & Shift Up::Send, {sc04B Up}
~Up & Shift::Send, {sc48 Down}
Up & Shift Up::Send, {sc48 Up}

при нажатии той же комбинации посылает только Num4. Причём когда прописан виртуальный код, идёт ввод соответствующего символа, а со скэн кодом нет.

Twente пишет:

Можно ли реализовать при нажатии такой комбинации посылание Num8 + Num4 вместе...

Как-то так:

~Up & Shift::
   Send, {vk68 Down}
   While (GetKeyState("Up", "P") && GetKeyState("Left", "P"))
      {
         If GetKeyState("Shift", "P")
            {
               Send, {vk64 Down} ; Send, {vk68 Down}{vk64 Down}
               KeyWait, Shift
               Send, {vk64 Up} ; Send, {vk68 Up}{vk64 Up}
            }
      }
   Return
Up & Shift Up::Send, {vk68 Up}
Twente пишет:

3) Как правильно составлять синтакис комбинации из трех или более горячих клавиш...

Я пробовал так.

Twente пишет:

Каким образом можно бороться с залипаниями "виртуальных" (Посланных скриптом) и физических клавиш...

Хороший "неконкретнный вопрос", думаю заслуживает отдельной темы, там смогут все желающие высказаться.

34

Re: AHK: Переназначение клавиш в зависимости от условия для игры FIFA11

Grey, спасибо огромное вам за оказанную бескорыстную помощь!