1

Тема: AHK: Действие по правому клику, не нарушая Down

Пытаюсь добиться эффекта, при котором, при определённых условиях , после правого клика мышкой будет выполнен нужный мне набор команд. 
Сначала использовал ~RButton. Команды выполняются, но пропали действия, которые можно выполнить при зажатой правой кнопке мыши.
Попробовал перейти на ~RButton UP, в нужном месте появляется ненужное окно(стандартная реакция программы), которое нарушает условия и нужный мне набор команд не выполняется.

  Можно как-то использовать RButton так, чтобы не пропадали действия, которые можно выполнить при зажатой правой кнопке мыши?

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

2

Re: AHK: Действие по правому клику, не нарушая Down

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

3

Re: AHK: Действие по правому клику, не нарушая Down

Подходит. Я пробовал что-то такое внутри "~RButton" соорудить - опрашивал нажата ли ещё правая клавиша когда "RButton::" уже сработал, но что-то не пошло у меня.

4

Re: AHK: Действие по правому клику, не нарушая Down

Если нужен код, то давайте конкретику. Что за условие, какое действие, и т.д. и т.п.

5 (изменено: Pokerist, 2012-11-24 15:23:06)

Re: AHK: Действие по правому клику, не нарушая Down

YMP пишет:

Если нужен код, то давайте конкретику. Что за условие, какое действие, и т.д. и т.п.

Да, собственно от этой конкретики  ничего  не зависит.

RButton::
УСЛОВИЕ
  {
  комманды
  }
return

Как тут поймать что ЗАЖАТА RButton?  GetKeyState не работает.

6

Re: AHK: Действие по правому клику, не нарушая Down

Чего бы ей не работать? Должна работать.

7 (изменено: Pokerist, 2012-11-24 17:14:52)

Re: AHK: Действие по правому клику, не нарушая Down

YMP пишет:

Чего бы ей не работать? Должна работать.

По крайней мере так я его примостил "внутри", не работает:


LButton::
IfWinActive, 123
    {
    SoundBeep
    }
else
    {
    GetKeyState, state, LButton
    if (state = "D")
        MsgBox, 1
    }
return

При клике в любом окне, кроме несуществующего "123",  должен появится MsgBox, но этого не происходит. 
  Как правильно применить тут GetKeyState?

8

Re: AHK: Действие по правому клику, не нарушая Down

GetKeyState, state, LButton, P

9

Re: AHK: Действие по правому клику, не нарушая Down

или

~LButton::

10 (изменено: Pokerist, 2012-11-24 18:48:21)

Re: AHK: Действие по правому клику, не нарушая Down

Заработало. Но что-то я не врублюсь как в этом

LButton::
IfWinActive, nettakogo
    {
    SoundBeep
    }
else
    {
    GetKeyState, state, LButton, P
    if (state = "D")
        MsgBox, 1
    }
return

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

11

Re: AHK: Действие по правому клику, не нарушая Down

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

#if определённые_условия = true
    Rbutton::
        действия
        return
#if
LButton::
IfWinActive, nettakogo
    {
    SoundBeep
    }
else
    {
    GetKeyState, state, LButton, P

Какой смысл в проверке состояния Lbutton?  По-вашему, поиск активного окна может занять больше времени чем потребуется вам чтобы отпустить нажатую клавишу?

12

Re: AHK: Действие по правому клику, не нарушая Down

creature.ws пишет:

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

#if определённые_условия = true
    Rbutton::
        действия
        return
#if

Условия - это проверка окна под мышью на "то или нет", потом проверка места клика в окне "там или не там". Даже не знал, что хоткей можно расположить внутри проверки.    
   Да,  по идее можно повесить на таймер с периодом 1 мс все эти проверки, а потом ловить нажатия уже при соблюдённых условиях. 

13

Re: AHK: Действие по правому клику, не нарушая Down

Или ... можно вообще без таймера??? Я пока не знаю как эта конструкция работает.

14 (изменено: creature.ws, 2012-11-24 21:38:59)

Re: AHK: Действие по правому клику, не нарушая Down

#if WinActive("то или не то") && ТеИлиНеТеКоординаты()
    Rbutton::
        действия
        return
#if

не знаю как эта конструкция работает.

Ссылку на справку дать?

IsInTitle(winTitle := "")
{
    CoordMode, Mouse
    MouseGetPos, x, y, hwnd
    if WinExist(winTitle " ahk_id" hWnd)
        SendMessage 0x84,, % x | (y << 16)
    return ErrorLevel = 2
}

IsPointerInRegion(winTitle, x0, y0, x1, y1)
{
    CoordMode, Mouse, Client
    MouseGetPos, x, y, hwnd
    if WinExist(winTitle " ahk_id" hWnd)
        return x > x0 && x < x1 && y > y0 && y < y1
}

#if IsInTitle("ahk_class Notepad")
    Rbutton::MsgBox Правый клик в заголовке
#if IsPointerInRegion("ahk_class Notepad", 10, 10, 100, 100)
    Rbutton::MsgBox Правый клик в квадрате 90х90 левый верхний угол квадрата в точке 10 10
#if

15

Re: AHK: Действие по правому клику, не нарушая Down

И почему у меня самые красивые коды не работают?

\test.ahk (1) : ==> Missing comma

Понять-то их я уже особо и не пытаюсь...

16

Re: AHK: Действие по правому клику, не нарушая Down

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

Обновите ahk до актуальной версии, сохраняйте скрипты в utf-8 c bom, мойте руки перед едой.

17

Re: AHK: Действие по правому клику, не нарушая Down

creature.ws пишет:

сохраняйте скрипты в utf-8 c bom

Этого уже не нужно.

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

18

Re: AHK: Действие по правому клику, не нарушая Down

Если UTF, то BOM. Акцент — использование BOM.

Лично для меня, основная «фича» ahk_l — возможность сохранять юникод символы в теле скрипта.
ANSI кодировка скриптов по умолчанию — вредное изменение.

19

Re: AHK: Действие по правому клику, не нарушая Down

creature.ws пишет:

возможность сохранять юникод символы в теле скрипта.

Ну если только для этого.

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

20 (изменено: Pokerist, 2012-11-25 01:01:17)

Re: AHK: Действие по правому клику, не нарушая Down

Уважаемые знатоки AHK, файл бы сохранён в UTF-8, правда я не не знаю в BOM или не в BOM, потому что я тут ни бум-бум, но я убрал кирилицу, а легче не стало.
Просвятите, пожалуйста, в чём тут дело?

21

Re: AHK: Действие по правому клику, не нарушая Down

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

22 (изменено: Pokerist, 2012-11-25 01:09:45)

Re: AHK: Действие по правому клику, не нарушая Down

Спасибо, нашёл главный совет.

23

Re: AHK: Действие по правому клику, не нарушая Down

creature.ws пишет:
IsInTitle(winTitle := "")
{
    CoordMode, Mouse
    MouseGetPos, x, y, hwnd
    if WinExist(winTitle " ahk_id" hWnd)
        SendMessage 0x84,, % x | (y << 16)
    return ErrorLevel = 2
}

IsPointerInRegion(winTitle, x0, y0, x1, y1)
{
    CoordMode, Mouse, Client
    MouseGetPos, x, y, hwnd
    if WinExist(winTitle " ahk_id" hWnd)
        return x > x0 && x < x1 && y > y0 && y < y1
}

#if IsInTitle("ahk_class Notepad")
    Rbutton::MsgBox Правый клик в заголовке
#if IsPointerInRegion("ahk_class Notepad", 10, 10, 100, 100)
    Rbutton::MsgBox Правый клик в квадрате 90х90 левый верхний угол квадрата в точке 10 10
#if

Пытался разобраться в этой конструкции, но не преуспел.

Упростил насколько возможно и всё равно не работает.



test(var1)
{
    var1 := "1"
    return
}



#if test("1")
    Rbutton:: MsgBox 123 
#if

Что я упускаю?

24

Re: AHK: Действие по правому клику, не нарушая Down

Pokerist пишет:

Что я упускаю?

test(var1)
{
    return var1
}



#if test("1")
    Rbutton:: MsgBox 123 
#if

25

Re: AHK: Действие по правому клику, не нарушая Down

Всё равно что-то не доходит.

Ведь MsgBox появляется даже так:

test(var1 := "")
{
    var1 := "что угодно"
    return var1
}
 
 
 
#if test("совсем другое")
    ^j:: MsgBox 123 
#if

26

Re: AHK: Действие по правому клику, не нарушая Down

#if даст отрицательный результат, если test() вернёт пустое значение, пустую строку либо нуль.

27

Re: AHK: Действие по правому клику, не нарушая Down

YMP пишет:

#if даст отрицательный результат, если test() вернёт пустое значение, пустую строку либо нуль.

Ну, вообще-то я это предполагал с самого начала, но вот это

#if IsInTitle("ahk_class Notepad")

сбило совершенно.

28

Re: AHK: Действие по правому клику, не нарушая Down

«Вот это» возвращает true или false.

29

Re: AHK: Действие по правому клику, не нарушая Down

IsInTitle(winTitle := "")
{

    return ErrorLevel = 2
}

Вернётся результат проверки ErrorLevel на равенство с 2. Т.е. либо true (1), либо false (0).

30

Re: AHK: Действие по правому клику, не нарушая Down

YMP пишет:
IsInTitle(winTitle := "")
{

    return ErrorLevel = 2
}

Вернётся результат проверки ErrorLevel на равенство с 2. Т.е. либо true (1), либо false (0).

Если фукнция даёт уже готовый ответ "true (1), либо false (0)", то зачем здесь

#if IsInTitle("ahk_class Notepad")
   ...
#if IsPointerInRegion("ahk_class Notepad", 10, 10, 100, 100)

ещё какие-то значения вставляются?

Зачем тут тот же "ahk_class Notepad"?

31

Re: AHK: Действие по правому клику, не нарушая Down

Она не даёт готового ответа. Значение ErrorLevel является результатом вызова SendMessage. "Какие-то значения" вставляются, чтобы их использовать внутри функций.

Например, если я спрошу у вас: "Вы негр?", то вы мне можете ответить либо да, либо нет. А если я не вставлю туда значение "негр", то вы не сможете мне ничего ответить, т.к. не будете даже знать, о чём я вас спрашиваю.
ahk_class Notepad играет ту же роль.

32 (изменено: Pokerist, 2012-11-26 18:03:25)

Re: AHK: Действие по правому клику, не нарушая Down

Вроде всё явно, но понять ничего не могу.

Пробую написать конструкцию, которая определит нахождение в имени окна определённого слова и определённого текста. Уже ушел от функции с двумя аргументами. Соединил всё в одно значение. И всё равно не понимаю, что где вводить, что запрашивать и чему присваивать.

SetTitleMatchMode, 2

if_nad_oknom_s_texstom(okno_i_text := "") 
    {
    CoordMode, Mouse, Screen
                 MouseGetPos, x, y, hwnd_okna
    WinGetTitle, name_okna, ahk_id %hwnd_okna%
    WinGetText, text_okna, ahk_id %hwnd_okna%
    
    IfInString, name_okna, Блокнот
        IfInString, text_okna, Pr
            argument := 1

    return argument
    }


#if if_nad_oknom_s_texstom(argument)
    ^k:: MsgBox Yes
#if

Что я только не переставлял и не вносил - срабатывает или во всех окнах или ни в каких.

Помогите, пожалуйста откорректировать.  Тестовое окно: Блокнот со словом Privet

33

Re: AHK: Действие по правому клику, не нарушая Down

if_nad_oknom_s_texstom(Title, Text) 
    {
    CoordMode, Mouse, Screen
                 MouseGetPos, x, y, hwnd_okna
    WinGetTitle, name_okna, ahk_id %hwnd_okna%
    WinGetText, text_okna, ahk_id %hwnd_okna%
    
    IfInString, name_okna, %Title%
        IfInString, text_okna, %Text%
            argument := 1

    return argument
    }


#if if_nad_oknom_s_texstom("Блокнот", "Privet")
    ^k:: MsgBox Yes
#if

34

Re: AHK: Действие по правому клику, не нарушая Down

Вот теперь понятно, где аргумент, когда он запрашивается, где используется и  во что превращается! 
Не знаю, правда, почему с "Блокнот"  не сработало, но после сохранения файла из Блокнота и изменения аргумента на соответсвующий имени окна - всё работает прекрасно.
Большое спасибо!
С остальным надеюсь справиться сам.