1 (изменено: asaer, 2013-08-10 00:54:25)

Тема: AHK: исп-ие ассоциативного массива для определения хоткеев

Здравствуйте.

Как можно создать горячие комбинации клавиш имея ассоциативный массив вида {'#f': 'a', '#g': 'b' и т.п.}, где ключ обозначает комбинацию клавиш, кот мы переопределяем, значение - что мы посылаем.
А если при нажатии, напр, #f, зажата клавиша(-ы) Ctrl, Alt, Shift, она(-и) тоже посылалась(-ись), т.е. чтобы при нажатии ^#f посылала ^a, ^!#f посылала ^!a и т.п.

Заранее спасибо.

2 (изменено: serzh82saratov, 2013-08-09 13:57:06)

Re: AHK: исп-ие ассоциативного массива для определения хоткеев

1. Как можно использовать ассоциативный массив в AHK?

Смотря для чего... Опишите задачу.

2. Как можно создать горячие комбинации клавиш имея такой ассоциативный массив вида ['#f': 'a', '#g': 'b' и т.п.], где ключ обозначает комбинацию клавиш, кот мы переопределяем, значение - что мы посылаем. При этом чтобы при нажимании клавиш модификаторов Ctrl, Shift, Alt, они тоже посылались, даже если нажаты все три модификатора сразу.

Незнаю правильно ли я понял:


KeyArr := {"#vk46": "a", "#vk47": "b"}
For Key in KeyArr
    Hotkey, *%Key%, PressKey
Return
 
PressKey:
    ThisHotkey := SubStr(A_ThisHotkey, 2)
    Value := KeyArr[ThisHotkey]
    SendInput {%Value%} 
    Return

3. Как поменять клавишу модификатор на другую, например, чтобы при нажимании правого альта (RAlt) посылался Ctrl, при этом, нужно менять подобные комбинации:


RAlt & vk46:: SendInput ^{vk46}
Shift & RAlt:: SendInput +^{vk46}
LAlt & RAlt:: SendInput !^{vk46}

--------------------------------------------

И прочитайте это -http://forum.script-coding.com/viewtopic.php?id=5421.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: исп-ие ассоциативного массива для определения хоткеев

asaer, прочитайте указанную выше ссылку, отредактируйте заголовок. Также ознакомьтесь с Правилами форума, в частности с этим. Выберите какой-то один вопрос, остальные обсуждайте в других темах.

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

4 (изменено: asaer, 2013-08-10 00:59:31)

Re: AHK: исп-ие ассоциативного массива для определения хоткеев

serzh82saratov,
Почти то, что нужно


KeyArr := {"#vk46": "a", "#vk47": "b"}
For Key in KeyArr
    Hotkey, *%Key%, PressKey
Return
 
PressKey:
    ThisHotkey := SubStr(A_ThisHotkey, 2)
    Value := KeyArr[ThisHotkey]
    SendInput {%Value%} 
    Return

только если при нажатии, напр, #f, зажата клавиша(-ы) Ctrl, Alt, Shift, она(-и) тоже посылалась(-ись), т.е. чтобы при нажатии ^#f посылала ^a, ^!#f посылала ^!a и т.п.

5

Re: AHK: исп-ие ассоциативного массива для определения хоткеев

Модератор пишет:

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

На замечания модераторов  у нас реагируют соответствующе.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: исп-ие ассоциативного массива для определения хоткеев

Уф фуф фуф. и замена клавишы RAlt клавишей Ctrl ведь можно удалить!?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: исп-ие ассоциативного массива для определения хоткеев

asaer пишет:

только если при нажатии, напр, #f, зажата клавиша(-ы) Ctrl, Alt, Shift, она(-и) тоже посылалась(-ись), т.е. чтобы при нажатии ^#f посылала ^a, ^!#f посылала ^!a и т.п.

Строчку

SendInput {%Value%} 

заменить на

    SendInput % (GetKeyState("Control","P") ? "^" : "")
              . (GetKeyState("Shift","P") ? "+" : "")
              . (GetKeyState("Alt","P") ? "!" : "")
              . "{" . Value . "}"

8

Re: AHK: исп-ие ассоциативного массива для определения хоткеев

Может проще так:

SendInput {Blind}{%Value%} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: исп-ие ассоциативного массива для определения хоткеев

Irbis пишет:

заменить на

    SendInput % (GetKeyState("Control","P") ? "^" : "")
              . (GetKeyState("Shift","P") ? "+" : "")
              . (GetKeyState("Alt","P") ? "!" : "")
              . "{" . Value . "}"

получается след код:


KeyArr := {"#vk46": "a"}
            
For Key in KeyArr
    Hotkey, *%Key%, PressKey
Return

PressKey:
    ThisHotkey := SubStr(A_ThisHotkey, 2)    
    Value := KeyArr[ThisHotkey]
    
    SendInput % (GetKeyState("Control","P") ? "^" : "")
              . (GetKeyState("Shift","P") ? "+" : "")
              . (GetKeyState("Alt","P") ? "!" : "")
              . "{" . Value . "}"
    
    Return

Работает, но при нажимании RCtrl, RShift, RAlt работает, но появляется пуск (т.е. посылается Win)

serzh82saratov пишет:

Может проще так:

SendInput {Blind}{%Value%} 

При этом будет зажиматься клавиша Win (хоткей создается для #vk43, поэтому такой метод подойдет, если в хоткее нет !^+#

Для создания хоткеев исп-ся

Hotkey, *%Key%, PressKey

Но * не работает с комбинациями типа vk20 & vk46, т.е. где первая клавиша не из множества !^+#
Итак используя ассоциативный массив - {'vk20&vk46': 'a'}), хоткей назначается только на первую клавишу из комбинации, в моем примере - vk20. Как это исправить?

10 (изменено: serzh82saratov, 2013-08-11 07:09:01)

Re: AHK: исп-ие ассоциативного массива для определения хоткеев

При этом будет зажиматься клавиша Win (хоткей создается для #vk43, поэтому такой метод подойдет, если в хоткее нет !^+#

Попробуй как то так:

*#vk53::SendInput {Blind}{LWin Up}{RWin Up}{vk41}

Но * не работает с комбинациями типа vk20 & vk46

Так и не надо чтоб работал:

1 & 2::SendInput {Blind}{vk41} 

При зажатом ктрл так посылается ктрл + А.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: исп-ие ассоциативного массива для определения хоткеев

serzh82saratov пишет:

Попробуй как то так:

*#vk53::SendInput {Blind}{LWin Up}{RWin Up}{vk41}

Но * не работает с комбинациями типа vk20 & vk46

Так и не надо чтоб работал:

1 & 2::SendInput {Blind}{vk41} 

При зажатом ктрл так посылается ктрл + А.

Спасибо. Я немного изменил скрипт с исп-ем ассоциативного массива для этого случая:


KeyArr := {"Space & f": "Right"}
            
For Key in KeyArr
    Hotkey, %Key%, PressKey ; удалил * перед %Key%
Return
 
$Space::Send, {Space} ; чтобы пробел по прежнему работал

PressKey:
    Value := KeyArr[A_ThisHotkey]
    SendInput {Blind}{%Value%}
    Return

Тема может быть закрыта, всем большое спасибо за помощь