1

Тема: AHK: Захват буфера в GUI-окно по выбору CheckBox

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


Gui, +AlwaysOnTop
Gui, Add, CheckBox, x400 y10 Checked1 vBfr, Bfr
Gui, Add, Edit, vLnk_Lst x9 ym+47 h218 w593, %Lnk_Lst%
Gui, Show, h280 w616, MWin

loop
{
   sleep 1000
   ControlGet,Bfr,Checked,,Button1,A ;ahk_class AutoHotkeyGUI
   If Bfr = 1
   {
      tooltip 1
      OnClipboardChange(Func("ToolTip").Bind(ClipBoard, 1000))
      ControlSend, Edit1, %ClipBoard%`n, A
      ;Control, EditPaste, % ClipBoard, % Focus, A
   }
   else
      Bfr =
   tooltip
}
return

ToolTip(text, time)  {
    ToolTip, %ClipBoard%
    SetTimer, HideToolTip, -%time%
    Return

    HideToolTip:
        ToolTip
        Return
}

2

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

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

Gui, +AlwaysOnTop
Gui, Add, CheckBox, x10 y15 checked gOnCheck, Отображать буфер обмена
Gui, Add, Edit, xp y+10 w450 h250
Gui, Show
OnClipboardChange("ShowClipboard")
Return

GuiClose:
   ExitApp

ShowClipboard(type) {
   if (type = 1) ; text
      GuiControl,, Edit1, % Clipboard
}

OnCheck() {
   static t := 1
   OnClipboardChange("ShowClipboard", t := !t)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

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

4

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

Gui, +AlwaysOnTop
Gui, Add, CheckBox, x10 y15 checked gOnCheck, Отображать буфер обмена
Gui, Add, Edit, xp y+10 w450 h250 hwndhEdit
Gui, Show
OnClipboardChange("ShowClipboard")
Return

GuiClose:
   ExitApp

ShowClipboard(type) {
   global hEdit
   if (type = 1) ; text
      Control, EditPaste, %Clipboard%`r`n,, ahk_id %hEdit%
}

OnCheck() {
   static t := 1
   OnClipboardChange("ShowClipboard", t := !t)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

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

Gui, +AlwaysOnTop
Gui, Add, CheckBox, x10 y15 checked gOnCheck, Отображать буфер обмена
Gui, Add, Edit, xp y+10 w450 h250 hwndhEdit
Gui, Show
OnClipboardChange("ShowClipboard")
Return

GuiClose:
   ExitApp

ShowClipboard(type) {
   global hEdit
   static EM_SETSEL := 0xB1, EM_REPLACESEL := 0xC2
   if (type != 1) ; text
      Return
   str := Clipboard . "`r`n"
   SendMessage, EM_SETSEL, -2, -1,, ahk_id %hEdit%
   SendMessage, EM_REPLACESEL,, &str,, ahk_id %hEdit%
}

OnCheck() {
   static t := 1
   OnClipboardChange("ShowClipboard", t := !t)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

Большое спасибо!

7

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

Никак не пойму — каким образом можно по умолчанию сделать галку отжатой? Удалял слово "checked", менял на "checked0", прописывал какие-то условия в коде, но не удается найти то самое .

8 (изменено: teadrinker, 2021-04-23 18:58:45)

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

А если удалить checked, у вас она не отжатой появляется?
Наверно файл забыли сохранить.

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

9

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

Да, если удалить — неотжатой появляется, но продолжает копировать в буфер. Тут же если галку поставить — не копирует буфер, и наоборот.

10

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

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

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

11

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

Днем два часа пытался понять и сейчас не клеится . Так и не нашел переменную, отвечающую за состояние CheckBox.

12

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

А зачем вам такая переменная?

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

13

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

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

14

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

Я бы так сделал:

Ch := 1	; Галка по умолчанию.

Gui, +AlwaysOnTop
Gui, Add, CheckBox, x10 y15 Checked%Ch% gOnCheck, Отображать буфер обмена
Gui, Add, Edit, xp y+10 w450 h250 hwndhEdit
Gui, Show
OnClipboardChange("ShowClipboard", Ch)
Return

GuiClose:
   ExitApp

ShowClipboard(type) {
   global hEdit
   static EM_SETSEL := 0xB1, EM_REPLACESEL := 0xC2
   if (type != 1) ; text
      Return
   str := Clipboard . "`r`n"
   SendMessage, EM_SETSEL, -2, -1,, ahk_id %hEdit%
   SendMessage, EM_REPLACESEL,, &str,, ahk_id %hEdit%
}

OnCheck() {
   Global Ch
   OnClipboardChange("ShowClipboard", Ch := !Ch)
}
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

15

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

peterverhovensky пишет:

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

Возможный подход, но в данном случае особого смысла не имеет, т. к. у чекбокса возможно всего два состояния, и при клике по нему состояние переключается на противоположное. Поэтому нам достаточно знать его изначальное состояние, чтобы после каждого переключения знать текущее.
__Михаил__, нет смысла переменную-переключатель делать глобальной, глобальных переменных следует избегать. Я использовал глобальную hEdit, но это только потому, что она глобальная изначально.

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

16 (изменено: __Михаил__, 2021-04-24 02:38:06)

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

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

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

17

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

Спасибо, вроде заработало:

Gui, +AlwaysOnTop
Gui, Add, CheckBox, x10 y15 checked0 gOnCheck, Отображать буфер обмена
Gui, Add, Edit, xp y+10 w450 h250 hwndhEdit
Gui, Show
OnClipboardChange("ShowClipboard", 0)
Return

GuiClose:
   ExitApp

ShowClipboard(type) {
   global hEdit
   static EM_SETSEL := 0xB1, EM_REPLACESEL := 0xC2
   if (type != 1) ; text
      Return
   str := Clipboard . "`r`n"
   SendMessage, EM_SETSEL, -2, -1,, ahk_id %hEdit%
   SendMessage, EM_REPLACESEL,, &str,, ahk_id %hEdit%
}

OnCheck() {
   static t := 0
   OnClipboardChange("ShowClipboard", t := !t)
}

18

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

__Михаил__ пишет:

Глобальные переменные это в первую очередь удобно, во вторую понятно для примера новичку.

А чем удобнее в сравнении со static?

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

19

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

А новички знают что такое static? Я думаю нет.
Далее спор считаю бессмысленным.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

20

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

__Михаил__ пишет:

Далее спор считаю бессмысленным.

Это мощный аргумент, конечно.
Давайте, я тоже им воспользуюсь:
А новички знают что такое global? Я думаю нет.
Далее спор считаю бессмысленным.

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

21

Re: AHK: Захват буфера в GUI-окно по выбору CheckBox

Новичок, которому нужно научиться, увидев новую команду, изучит её.