1

Тема: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

Как запретить ввод ПРОБЕЛА в поле для ввода?
В том числе и чтобы при Ctrl+V все пробелы, что были в предложении просто не проставлялись.
Те при копировании сообщения "1 2 ы 3 5 6", вставилось "12ы356"

Пример кода


#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
show := 1 

gui_name := "Main" 
Gui, %gui_name%: +AlwaysOnTop 
Gui, %gui_name%:Add, Edit, x5 y5 w400 h400 vEdit 
Gui, %gui_name%:Show 

SetTimer, CheckEdit, 50 
return 

CheckEdit: 
Gui, %gui_name%:Submit, NoHide 
if Edit contains gg 
{ 
GuiControl, %gui_name%:, Edit 
MsgBox, % "gg" 
} 
return 

Для чего это нужно: если в строке

if Edit contains gg

а именно к ключ.слову добавить ещё слово через пробел

if Edit contains gg as

то введя в поле для ввода as функция сработает, хотя gg не было написано.

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

2

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

MirchikAhtung пишет:

Для чего это нужно: если в строке

if Edit contains gg

а именно к ключ.слову добавить ещё слово через пробел

if Edit contains gg as

то введя в поле для ввода as функция сработает, хотя gg не было написано.

Это не так:

var := "as"
if var contains gg as
   MsgBox, var contains "gg as"
else
   MsgBox, var doesn't contain "gg as"

Мало что понятно. Зачем запрещать пробел, если ложное срабатывание при вводе "as"?
Объясните лучше не что не должно быть в поле Edit, а что должно быть.

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

3

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

MirchikAhtung пишет:

SetTimer, CheckEdit, 50

Gui Add, Edit, gCheckEdit hwndhEdit
...
CheckEdit:
ControlGetText text,, ahk_id %hEdit%
...
ControlSetText

4

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker
Нужно чтобы функция срабатывала лишь тогда, когда в поле для ввода написано gg aa, а не ИЛИ аа ИЛИ gg.
Только вместе. Чтобы срабатывало когда они написаны только вместе.

5

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

stealzy Заменить с конца кода на

Gui Add, Edit, gCheckEdit hwndhEdit
...
CheckEdit:
ControlGetText text,, ahk_id %hEdit%
...
ControlSetText

по

SetTimer, CheckEdit, 50 
return 

?
В итоге что выйдет?

6

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

MirchikAhtung пишет:

teadrinker
Нужно чтобы функция срабатывала лишь тогда, когда в поле для ввода написано gg aa, а не ИЛИ аа ИЛИ gg.
Только вместе. Чтобы срабатывало когда они написаны только вместе.

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

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

7 (изменено: MirchikAhtung, 2018-04-13 18:16:09)

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker Вовсе нет ;-)
В поле должно быть gg ss
msgbox 1
Либо если в поле gg s
msgbox 2
Либо если в поле ss g
msgbox 3

8

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

У вас условия как-то слишком часто меняются.

values := ["gg ss", "gg s", "ss g"]

Gui, Add, Edit, vEdit gWatchEdit
Gui, Show
Return

WatchEdit()  {
   global values
   GuiControlGet, Edit
   for k, v in values
      if RegExMatch(Edit, "^\Q" . v . "\E$") && i := k
         break
   if i
      MsgBox, % i
}

Всё равно непонятно:

MirchikAhtung пишет:

В поле должно быть gg ss

у вас тут явно пробел между gg и ss. Если его запретить, как его вводить тогда?

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

9

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker  А вот тут по-подробнее.
В самой теме я написал Либо запретить пробел, Либо сделать так, как выше написал.
Если запретить пробел, то там будет чуть другой способ ввода. Просто чтобы ПРОБЕЛ не считывался, те не работал при вводе.

10

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

MirchikAhtung пишет:

Либо сделать так, как выше написал.

А мой последний код не так работает?

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

11 (изменено: MirchikAhtung, 2018-04-13 22:17:17)

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker Да, отлично работает, лишь два вопроса:
1. Можно ли поставить задержку, допустим 3 секунды, после которых срабатывают мсгбоксы, те функции.
2. Я хотел заменить мсгбоксы на другие функции и брал их лишь в пример, а в этом коде выскакивает мсгбокс по номерации ключ.слова.
Можно как-то разделить, чтобы под "gg ss" была функция " Exit:app ", под " gg s " "MsgBox привет " и.т.д. ?

12 (изменено: teadrinker, 2018-04-14 01:00:47)

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

1. Можно выполнить действие по таймеру:

values := ["gg ss", "gg s", "ss g"]

Gui, Add, Edit, vEdit gWatchEdit
Gui, Show
Return

WatchEdit()  {
   global values
   GuiControlGet, Edit
   for k, v in values
      if RegExMatch(Edit, "^\Q" . v . "\E$") && i := k
         break
      
   if i  {
      timer := Func("Action").Bind(i)
      SetTimer, % timer, -3000
   }
}

Action(i)  {
   MsgBox, % i
}

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

values := [ {input: "gg ss", function: Func("FirstFunc" )}
          , {input: "gg s" , function: Func("SecondFunc")}
          , {input: "ss g" , function: Func("ThirdFunc" )} ] 

Gui, Add, Edit, vEdit gWatchEdit
Gui, Show
Return

WatchEdit()  {
   global values
   GuiControlGet, Edit
   for k, v in values
      if RegExMatch(Edit, "^\Q" . v.input . "\E$") && i := k
         break
      
   if i
      values[i].function.Call()
}

FirstFunc()  {
   ExitApp
}

SecondFunc()  {
   MsgBox, "gg s"
}

ThirdFunc()  {
   MsgBox, "ss g"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker

values := [ {input: "gg ss", function: Func("FirstFunc" )}
          , {input: "gg s" , function: Func("SecondFunc")}
          , {input: "ss g" , function: Func("ThirdFunc" )} ] 

Gui, Add, Edit, vEdit gWatchEdit
Gui, Show
Return

WatchEdit()  {
   global values
   GuiControlGet, Edit
   for k, v in values
      if RegExMatch(Edit, "^\Q" . v.input . "\E$") && i := k
         break
      
   if i
      values[i].function.Call()
}

   if i  {
      timer := Func("FirstFunc").Bind(i)
      SetTimer, % timer, -3000
   }

FirstFunc()  {
   ExitApp
}

SecondFunc()  {
   MsgBox, "gg s"
}

ThirdFunc()  {
   MsgBox, "ss g"
}values := [ {input: "gg ss", function: Func("FirstFunc" )}
          , {input: "gg s" , function: Func("SecondFunc")}
          , {input: "ss g" , function: Func("ThirdFunc" )} ] 

Gui, Add, Edit, vEdit gWatchEdit
Gui, Show
Return

WatchEdit()  {
   global values
   GuiControlGet, Edit
   for k, v in values
      if RegExMatch(Edit, "^\Q" . v.input . "\E$") && i := k
         break
      
   if i
      values[i].function.Call()
}

[b]   if i  {
      timer := Func("FirstFunc").Bind(i)
      SetTimer, % timer, -3000
   }[/b]

FirstFunc([b]i[/b])  {
   ExitApp
}

SecondFunc()  {
   MsgBox, "gg s"
}

ThirdFunc()  {
   MsgBox, "ss g"
}

Таймер нужно ставить на каждую функцию, т.е нельзя чтобы задержка 3 сек была на все функции?
Не срабатывает таймер на первую функцию. Где неправильно?

14 (изменено: MirchikAhtung, 2018-04-14 19:29:01)

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker
Добавил задержку, но вписав gg s, gg ss либо ss g - итог 1, выскакивает msgbox gg s

values := [ {input: "gg ss", function: Func("FirstFunc" )}
          , {input: "gg s" , function: Func("SecondFunc")}
          , {input: "ss g" , function: Func("ThirdFunc" )} ] 

Gui, Add, Edit, vEdit gWatchEdit
Gui, Show
Return

WatchEdit()  {
   global values
   GuiControlGet, Edit
   for k, v in values
      if RegExMatch(Edit, "^\Q" . v.input . "\E$") && i := k
         break
      
   if i  {
      timer := Func("SecondFunc").Bind(i)
      SetTimer, % timer, -3000
   }
      else if i  {
      timer := Func("ThirdFunc").Bind(i)
      SetTimer, % timer, -5000
   }
         else if i  {
      timer := Func("Firstfunc").Bind(i)
      SetTimer, % timer, -10000
   }
}

FirstFunc()  {
   ExitApp
}

SecondFunc()  {
   MsgBox, "gg s"
}

ThirdFunc()  {
   MsgBox, "ss g"
}

Где я ошибся?

15

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

MirchikAhtung пишет:

Где я ошибся?

   if i  {
      timer := Func("SecondFunc").Bind(i)
      SetTimer, % timer, -3000
   }
      else if i  {
      timer := Func("ThirdFunc").Bind(i)
      SetTimer, % timer, -5000
   }
         else if i  {
      timer := Func("Firstfunc").Bind(i)
      SetTimer, % timer, -10000
   }

Можете на словах объяснить, что у вас вот эта конструкция означает?

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

16

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker Это я попробывал поставить таймер на все 3 функции :-(

17

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

MirchikAhtung, рукалицо.jpeg

values := [ {input: "gg ss", function: Func("FirstFunc" ), delay: 3000}
          , {input: "gg s" , function: Func("SecondFunc"), delay: 3000}
          , {input: "ss g" , function: Func("ThirdFunc" ), delay: 3000} ] 

Gui, Add, Edit, vEdit gWatchEdit
Gui, Show
Return

WatchEdit()  {
   global values
   GuiControlGet, Edit
   for k, v in values
      if RegExMatch(Edit, "^\Q" . v.input . "\E$") && i := k
         break
      
   if i  {
      obj := values[i]
      if !obj.delay
         obj.function.Call()
      else  {
         timer := obj.function
         SetTimer, % timer, % "-" . obj.delay
      }
   }
}

FirstFunc()  {
   ExitApp
}

SecondFunc()  {
   MsgBox, "gg s"
}

ThirdFunc()  {
   MsgBox, "ss g"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker
Вдвойне рукалицо.
GuiControl, vEdit в функции после msgbox не затирает поле для ввода, мои знания в AHK очень скудны, и помимо этого ничего не лезет в голову..


SecondFunc()  {
   MsgBox, "gg s"
GuiControl,, vEdit
}

19

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

MirchikAhtung пишет:
GuiControl,, vEdit

Ассоциированная переменная не vEdit, а просто Edit. v — это название опции.

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

20

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker пишет:

Ассоциированная переменная не vEdit, а просто Edit. v — это название опции.

GuiControl,, Edit 


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

21

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

У меня зачищает.

Gui, Add, Edit, vEdit w150, Текст
Gui, Show
Sleep, 1000
GuiControl,, Edit
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

22

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker пишет:

У меня зачищает.

Gui, Add, Edit, vEdit w150, Текст
Gui, Show
Sleep, 1000
GuiControl,, Edit

Вот моё начало, я не понимаю что тут всё портит..

show := 1 

values := [ {input: "gg ss", function: Func("FirstFunc" ), delay: 300}
          , {input: "gg s" , function: Func("SecondFunc"), delay: 300}
          , {input: "ss g" , function: Func("ThirdFunc" ), delay: 300} ] 
gui_name := "Main" 
Gui, %gui_name%: +AlwaysOnTop 
Gui, %gui_name%:Add, Edit, vEdit gWatchEdit w150, Текст
Gui, %gui_name%:Show
GuiControl,, %gui_name%:Edit
Return

23

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

MirchikAhtung пишет:
GuiControl,, %gui_name%:Edit

%gui_name% не в том месте. Читайте хелп внимательнее.

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

24

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker
Про шерстил с конца до середины https://autohotkey.com/docs/commands/GuiControl.htm
Я себе пару нервных клеток убил, но результата не дало.
Напишите прямой ответ! Захочу - не найду.

25 (изменено: teadrinker, 2018-04-16 01:05:52)

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

GuiControl, %gui_name%:, Edit

Ссылка на пример в хэлпе.

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

26 (изменено: MirchikAhtung, 2018-04-16 01:37:16)

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker
Я маленько запутался.
Я ранее пробовал - не работало.
Сейчас - не работает.
И так

GuiControl, %gui_name%:Show, Edit

и вот так

GuiControl, %gui_name%:, Edit

Не вижу очевидного, либо чего-то ещё не хватает?

27

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

gui_name := "Main" 
Gui, %gui_name%: +AlwaysOnTop 
Gui, %gui_name%:Add, Edit, vEdit w150, Текст
Gui, %gui_name%:Show
Sleep 1000
GuiControl, %gui_name%:, Edit 
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28 (изменено: MirchikAhtung, 2018-04-16 09:18:47)

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker
Похоже я не так объяснил, т.е запутав, из-за чего вы меня немного не так поняли.
Оно стирает, стирает ТЕКСТ при запуске скрипта, но нужно, чтобы стирало и текст что мы ввели, те gg s - выскочил msgbox - стёрлась строка и.т.д.

show := 1 

values := [ {input: "gg ss", function: Func("FirstFunc" ), delay: 300}
          , {input: "gg s" , function: Func("SecondFunc"), delay: 300}
          , {input: "ss g" , function: Func("ThirdFunc" ), delay: 300} ] 
gui_name := "Main" 
Gui, %gui_name%: +AlwaysOnTop 
Gui, %gui_name%:Add, Edit, vEdit gWatchEdit w150, ТЕКСТ
Gui, %gui_name%:Show
Sleep 1000
GuiControl, %gui_name%:, Edit 
Return

29

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

А, понял, в чём проблема. В функцию нужно передать имя окна, т. к. внутри функции переменная gui_name не видна:

values := [ {input: "gg ss", function: Func("FirstFunc" ), delay: 3000}
          , {input: "gg s" , function: Func("SecondFunc"), delay: 3000}
          , {input: "ss g" , function: Func("ThirdFunc" ), delay: 3000} ] 

gui_name := "Main"
Gui, %gui_name%:Add, Edit, vEdit gWatchEdit w150, Текст
Gui, %gui_name%:Show
Return

WatchEdit()  {
   global values
   GuiControlGet, Edit
   for k, v in values
      if RegExMatch(Edit, "^\Q" . v.input . "\E$") && i := k
         break
      
   if i  {
      obj := values[i]
      if !obj.delay
         obj.function.Call(A_Gui)
      else  {
         timer := obj.function.Bind(A_Gui)  ; передаём имя окна, оно здесь в переменной A_Gui
         SetTimer, % timer, % "-" . obj.delay
      }
   }
}

FirstFunc(GuiName)  {
   ExitApp
}

SecondFunc(GuiName)  {
   MsgBox, "gg s"
   GuiControl, %GuiName%:, Edit
}

ThirdFunc(GuiName)  {
   MsgBox, "ss g"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

30

Re: AHK: Как запретить ввод ПРОБЕЛА в поле для ввода?

teadrinker
Всё работает. Огромное вам спасибо :-)