1 (изменено: heinrich, 2015-04-26 22:45:00)

Тема: AHK: Закрыть форму меню автоматически через пару секунд

Здравствуйте.
Пробую написать скрипт наподобие функционала программы PopClip (Mac OX).
При выделение текста автоматически возле курсора появляется меню с кнопками Copy, Paste, Search in Google и т.д.
Подскажите как сделать, чтоб меню само исчезало через короткое время если по нему не кликнули
и работа дальше продолжалась?


~LButton::
TimeButtonDown = %A_TickCount%
; Wait for it to be released
Loop
{
   Sleep 10
   GetKeyState, LButtonState, LButton, P
   if LButtonState = U  ; Button has been released.
      break
   elapsed = %A_TickCount%
   elapsed -= %TimeButtonDown%
   if elapsed > 200  ; Button was held down too long, so assume it's not a double-click.
   {
      MouseGetPos x0, y0            ; save start mouse position
      Loop
   {
     Sleep 20                    ; yield time to others
     GetKeyState keystate, LButton
     IfEqual keystate, U, {
       MouseGetPos x, y          ; position when button released
       break
     }
   }
   if (x-x0 > 5 or x-x0 < -5 or y-y0 > 5 or y-y0 < -5)
   { ; mouse has moved
 
menu_context := false
            {
            if ( ! menu_context )
            {
            menu, context, add, Kopieren
            menu, context, add, Einf¸gen
            menu, context, add, Google
            menu_context := true
            }
            Menu, context, Show
            }
                return
                Kopieren:
                    Send, ^{vk43} ;Send, ^c ; Copy.
                    clipboard = %clipboard%    ; Convert the cliboard contents to plain text.
                return
                Google:
                    MsgBox, You selected "%A_ThisMenuItem%" in menu "%A_ThisMenu%".
                return
                Einf¸gen:
                    Send, ^{vk56} ;send, ^v ; Paste
                return
   
   
   } ; mouse has moved
      return
   }
}
; Otherwise, button was released quickly enough.  Wait to see if it's a double-click:
TimeButtonUp = %A_TickCount%
Loop
{
   Sleep 10
   GetKeyState, LButtonState, LButton, P
   if LButtonState = D  ; Button has been pressed down again.
      break
   elapsed = %A_TickCount%
   elapsed -= %TimeButtonUp%
   if elapsed > 350  ; No click has occurred within the allowed time, so assume it's not a double-click.
   {
      ;MouseClick, Left
      return
   }
}
; Since above didn't return, it's a double-click:
   Sleep, 100
   ;Send, ^c
return

2

Re: AHK: Закрыть форму меню автоматически через пару секунд

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

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

3 (изменено: heinrich, 2015-04-26 22:45:20)

Re: AHK: Закрыть форму меню автоматически через пару секунд

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

4

Re: AHK: Закрыть форму меню автоматически через пару секунд

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

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

5

Re: AHK: Закрыть форму меню автоматически через пару секунд

Вот в этой теме есть пара вариантов.

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

6 (изменено: yalanne, 2015-04-27 21:19:48)

Re: AHK: Закрыть форму меню автоматически через пару секунд

; Окно с кнопками скопировать, вставить,гуглить.
Gui Clip:add, button,w40,copy
Gui Clip:add, button,w40 xp+40,paste
Gui Clip:add, button,w40 xp+40,google
Gui, Clip:+AlwaysOnTop -Caption +ToolWindow +LastFound +HWNDGuiClip_hwnd
; ---
Time = 2000 ; Время через сколько пропадет окно (2 секунды)

CoordMode, Mouse, Screen            
#if WhiteListCtrl("Edit","Scintilla") ; Тут указывается белый список контролов на которые будет действовать скрипт.
    ~Lbutton up::
    GetSelect := GetSelect()
    if !GetSelect ; проверка выделенного текста. Эта функция содержит выделенный текст.
        return ; если выделенного текста нет то конец цикла.
    MouseGetPos,x,y ; получаем координаты курсора.
    x+=20,y+=20 ; смещаем на 20
    settimer Time_ClipWin,off ; сбрасываем предыдущий таймер(если есть)
    gui Clip:show,NA x%x% y%y% ; показываем окно, неактивное по указанным координатам.
    settimer Time_ClipWin,-%Time% ; Устанавливаем новый таймер, по окончанию перейдет на метку Time_ClipWin
return
#if 

Time_ClipWin:
    if (GetHwndWin() = GuiClip_hwnd) ; Если курсор находится на ранее созданном окне
        settimer Time_ClipWin,-%Time% ;то, продлится время
    else
        gui Clip:Hide ; иначе скроется.
return

; тут проверяется на какой кнопке был клик, при этом не теряет фокус активного окна
#if (GetHwndWin() = GuiClip_hwnd) ;Тут сравнивает hwnd окна что под курсором и окна Clip если истина то
    Lbutton:: ; левый клик на этом окне будет не активировать окно
    MouseGetPos,,,,ctrl_Clip ; а покажет над каким элементом в этом окне был клик
    RegExMatch(ctrl_Clip,"[0-9]+",ctrl_Clip) ; уберет буквенную часть оставив цифры которые соответствуют номеру кнопки.
    if ctrl_Clip = 1 ; При нажатии кнопки копировать
        {
        Clipboard := GetSelect
        tooltip Copy "%GetSelect%"
        }
    else if ctrl_Clip = 2 ; При нажатии кнопки вставить
        {
        send ^{SC02F}
        tooltip pasted from the clipboard
        }
    else if ctrl_Clip = 3 ; При нажатии кнопки гугл
        {
        Run https://www.google.com/search?q=%GetSelect%
        tooltip Search google "%GetSelect%"
        }
    settimer tooltip_off,off 
    settimer tooltip_off,-2000 ; через 2 секунды уберет подсказку. Ожидание идет через таймер что бы весь скрипт не ждал пока она уберется.
return
#if

tooltip_off:
tooltip
return

WhiteListCtrl(ctrls*){ ; В этой функции проверяется контрол под курсором есть ли он в белом списке.
    MouseGetPos,,,,control
    control := substr(control,1,RegExMatch(control, "[0-9]+$")-1) ; в переменной control хранится имя контрола над которым в данный момент курсор.Имя контрола указывается без индекса.
    for k, ctrl in ctrls ; Проверяет есть ли в белом списке
        if (ctrl = control) ; тот контрол который сейчас под курсором.
            return 1 ; если да, то ответ функции положительный
return 0 ; иначе отрицательный.
; При положительном ответе  первое условие #if будет истиной и продолжит работу.
}

GetSelect(){ ; проверка выделенного текста.
    bufclip := clipboard ; сохраняем буфер обмена в переменную.
    clipboard := "" ; Очищаем буфер обмена.
    send ^{SC02E} ; копируем выделенный текст(ctrl+с)
    select := clipboard ; заносим это в значение в переменную
    clipboard := bufclip ; восстанавливаем предыдущий буфер обмена.
return select ; ответ функции выделенная область.
}

GetHwndWin(){ ; тут определяется hwnd окна который под курсором.
    MouseGetPos,,,Hwnd_cursor
return Hwnd_cursor
}

7

Re: AHK: Закрыть форму меню автоматически через пару секунд

yalanne, идея мне понравилась, удобно. Только зачем всё так впритык писать? В чём фишка? Ведь нечитабельно совершенно.

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

8

Re: AHK: Закрыть форму меню автоматически через пару секунд

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

9

Re: AHK: Закрыть форму меню автоматически через пару секунд

yalanne пишет:

Сейчас же у меня нет много километровых строк

Вас из одной крайности в другую бросает! Вы в обычном блокноте скрипты пишете? В любой среде разработки отступы автоматически добавляются.

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

10 (изменено: yalanne, 2015-04-27 16:50:35)

Re: AHK: Закрыть форму меню автоматически через пару секунд

В notepad++ и скрипт синтаксиса ahk для него.
Я побывал в scite4autohotkey писать, но первый же его запуск отпугнул меня. все его окно бесконечно мигает черным.

Как в notepad++ включить авто отступы?

11

Re: AHK: Закрыть форму меню автоматически через пару секунд

Сам пользуюсь как раз scite4autohotkey. Когда окно мигает чёрным — это означает, что оперативная память чем-то занята под 100%.

Как в notepad++ включить авто отступы?

Не знаю, может, посоветует кто.

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

12

Re: AHK: Закрыть форму меню автоматически через пару секунд

В настройках на вкладке Разное.

13 (изменено: yalanne, 2015-04-27 21:05:40)

Re: AHK: Закрыть форму меню автоматически через пару секунд

YMP, спасибо.
Закомментил код.

14 (изменено: yalanne, 2015-04-27 21:11:58)

Re: AHK: Закрыть форму меню автоматически через пару секунд

А как правильней гугл ссылку сделать?
в моем коде это так:

run % "https://www.google.com/?q=" GetSelect

но не ищет. Надо еще кнопку поиска нажимать вручную после загрузки страницы.

15

Re: AHK: Закрыть форму меню автоматически через пару секунд

Правильно так:

GetSelect := "AutoHotkey"
Run https://www.google.com/search?q=%GetSelect%

Если открывается в IE, значит IE и есть у вас браузер по умолчанию.

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

16 (изменено: yalanne, 2015-04-28 21:56:04)

Re: AHK: Закрыть форму меню автоматически через пару секунд

Насчет умолчания в браузере. разобрался. В 10ке немного по другому браузер  выбирается:

+ скрин

http://i.imgur.com/3QGMa82.png

17

Re: AHK: Закрыть форму меню автоматически через пару секунд

Спасибо, то что нужно!
Только у меня иногда условие, что буфер обмена не пустой не выполняется и поэтому окно не появляется.

18 (изменено: yalanne, 2015-04-28 22:29:44)

Re: AHK: Закрыть форму меню автоматически через пару секунд

heinrich, Скорей всего отжатие кнопки происходит вне поля ввода.
Например вы начали выделять текст с право налево и у вас курсор зашел за границу
http://i.imgur.com/EMAO1x4.jpg
при этом случаи окно не покажется.

для фикса этого можно заменить строку

    ~Lbutton up::

на

    ~Lbutton::q:=1
#if q
    ~Lbutton up::
    q:=0